2014-06-26 43 views
1

所以我有我的Qt應用程序中的以下佈局的東西。QScrollArea動態調整subWidgets

QScroll Area 
    - QSrollArea's InternalWidget 
     -QVBoxLayout 
      -Layout 1 
       - some items 
       - QTableView 
      -Layout 2 
       - some items 
       - QTableView 

的QTableViews的內容是動態變化的,我想是每個表視圖的那樣大,因爲它必須是(無progressbars並且沒有空的空間)。我寫了一個函數來計算表的適當大小。問題是,當我動態調整其中一個TableViews時,它會在第二個視圖後面進行調整(而且應該發生的是整個第二個佈局會在第一個視圖中移動)。此外,在縮小表格視圖時,它與第二個佈局之間留有空白區域。

enter image description here

這裏是當我安排小部件代碼:

#include "Widget.h" 

#include <QVBoxLayout> 
#include <QLabel> 
#include <QTableView> 
#include <QStringBuilder> 
#include <QHeaderView> 
#include <QDebug> 

Widget::Widget(QWidget *parent) 
    : QWidget(parent), 
     m_tableView1(0), 
     m_tableView2(0), 
     m_model1(0), 
     m_model2(0), 
     m_numberOfRowsEdit(0) 
{ 
    this->resize(300, 520); 

    QVBoxLayout* mainLayout = new QVBoxLayout(this); 

    QScrollArea* mainArea = new QScrollArea(); 
    //mainArea->setWidgetResizable(true); 

    QWidget* scrollAreaWidget = new QWidget; 
    scrollAreaWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); 

    QVBoxLayout* scrollAreaWidgetLayout = new QVBoxLayout(scrollAreaWidget); 
    scrollAreaWidgetLayout->setSizeConstraint(QLayout::SetMinAndMaxSize); 

    QVBoxLayout* firstSubLayout = new QVBoxLayout; 
    QLabel* label = new QLabel("Label 1"); 
    m_tableView1 = new QTableView; 

    firstSubLayout->addWidget(label); 
    firstSubLayout->addWidget(m_tableView1); 

    scrollAreaWidgetLayout->addLayout(firstSubLayout); 

    QVBoxLayout* secondSubLayout = new QVBoxLayout; 
    QLabel* label2 = new QLabel("Label 2"); 
    m_tableView2 = new QTableView; 

    secondSubLayout->addWidget(label2); 
    secondSubLayout->addWidget(m_tableView2); 

    scrollAreaWidgetLayout->addLayout(secondSubLayout); 

    mainArea->setWidget(scrollAreaWidget); 
    mainLayout->addWidget(mainArea); 

    // Utility for dynamically changing rows 
    QHBoxLayout* hLayout = new QHBoxLayout; 

    QLabel* numberOfRowsLabel = new QLabel("Number of rows"); 
    m_numberOfRowsEdit = new QLineEdit; 
    QPushButton* numberOfRowsButton = new QPushButton("Apply"); 

    connect(numberOfRowsButton, SIGNAL(clicked()), SLOT(onApplyButtonPressed())); 

    hLayout->addWidget(numberOfRowsLabel); 
    hLayout->addWidget(m_numberOfRowsEdit); 
    hLayout->addWidget(numberOfRowsButton); 

    m_model1 = new QStandardItemModel(this); 
    m_tableView1->setModel(m_model1); 

    m_model2 = new QStandardItemModel(this); 
    m_tableView2->setModel(m_model2); 

    mainLayout->addLayout(hLayout); 
} 

Widget::~Widget() 
{ 
} 

QSize Widget::calculateTableDesiredSize(QTableView* const table) {...} 

void Widget::onApplyButtonPressed() 
{ 
    bool ok = false; 
    const int rowCount = m_numberOfRowsEdit->text().toInt(&ok); 
    if (!ok) 
    { 
     return; 
    } 

    this->initModel(m_model1, rowCount); 
} 

// inits model with rowCount rows 
void Widget::initModel(QStandardItemModel* const model, const int rowCount ) 
void Widget::resizeTable(QTableView* const table) 
+0

如何調整表格大小?嘗試使用'setFixedHeight()'。 –

+0

是的,setFixedHeight()表現良好。當我增加heigth時,小部件不會超越鄰居。但是,當我縮小firstTableView仍然留下一個空的空間。將所有小部件對齊到Top不會修復剩餘的空間。也許調整sizePolicy應該做的伎倆? – GeneralFailure

+0

嘗試在所有項目之後將'addStretch()'添加到'scrollAreaWidgetLayout'。 –

回答

0

您應該使用setFixedHeight()而不是resize()設置表格的高度。所有項目之後,你也應該addStretch()scrollAreaWidgetLayout