2014-06-26 2 views
1

Итак, у меня есть что-то вроде следующего макета в моем приложении Qt.QScrollArea с динамическим изменением размера подвиделей

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

Содержимое QTableViews динамично меняется, и то, что я хочу, чтобы каждый вид таблицы, чтобы быть столь же большим, как это должно быть (без и без индикаторов выполнения пустого пространства). Я написал функцию для вычисления соответствующего размера таблицы. Проблема в том, что когда я динамически изменяю размер одного из 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() ведет себя хорошо. Виджеты не переходят через своих соседей, когда я увеличиваю количество. Однако, когда я сжимаю firstTableView, после него остается пустое пространство. Выравнивание всех виджетов Top не устраняет оставшееся пространство. Может быть, настройка sizePolicy должна сделать трюк? – GeneralFailure

+0

Попробуйте 'addStretch()' в 'scrollAreaWidgetLayout' после всех своих элементов. –

ответ

0

Вы должны использовать setFixedHeight() вместо resize() установить высоту стола. Также вы должны addStretch() до scrollAreaWidgetLayout после всех его предметов.

Смежные вопросы