QScrollArea动态调整子小部件的大小

所以我在Qt应用程序中有类似下面的布局 .

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

QTableViews的内容正在动态变化,我想要的是每个表视图都必须是大的(没有进度条,没有空格) . 我编写了一个函数来计算表的适当大小 . 问题是,当我动态调整其中一个TableView时,它会在第二个视图后面(并且应该发生的是整个第二个布局在第一个布局之后移动) . 此外,当收缩表视图时,它与第二个布局之间留有空白空间 .

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 )

回答(1)

3 years ago

您应该使用 setFixedHeight() 而不是 resize() 来设置表高度 . 此外,你应该 addStretch()scrollAreaWidgetLayout 之后的所有项目 .