1

したがって、Qt アプリケーションには次のようなレイアウトがあります。

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

QTableViews の内容は動的に変化します。私が望むのは、各テーブル ビューを必要なだけ大きくすることです (プログレスバーや空きスペースなしで)。テーブルの適切なサイズを計算する関数を作成しました。問題は、TableViews の 1 つを動的にサイズ変更すると、2 番目のビューの背後に移動することです (2 番目のレイアウト全体が最初のレイアウトの下に移動する必要があります)。さらに、テーブル ビューを縮小すると、テーブル ビューと 2 番目のレイアウトの間に空きスペースが残ります。

ここに画像の説明を入力

ウィジェットを配置するときのコードは次のとおりです。

#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 )
4

1 に答える 1

0

テーブルの高さを設定するsetFixedHeight()代わりに使用する必要があります。resize()また 、すべてのアイテムの後にする必要addStretch()があります。scrollAreaWidgetLayout

于 2014-06-27T14:25:54.917 に答える