#c #qt #layout #qscrollarea
#c #qt #макет #qscrollarea
Вопрос:
Итак, у меня есть что-то вроде следующего макета в моем приложении Qt.
QScroll Area
- QSrollArea's InternalWidget
-QVBoxLayout
-Layout 1
- some items
- QTableView
-Layout 2
- some items
- QTableView
Содержимое QTableViews динамически меняется, и я хочу, чтобы каждое табличное представление было таким большим, каким оно должно быть (без панелей прогресса и без пустого пространства). Я написал функцию для вычисления соответствующего размера таблицы. Проблема в том, что когда я динамически изменяю размер одного из табличных представлений, он оказывается позади второго представления (и что должно произойти, так это то, что весь второй макет будет перемещен ниже первого). Кроме того, при сжатии табличного представления между ним и вторым макетом остается пустое пространство.
Вот код, когда я упорядочиваю виджеты:
#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( amp;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. Как изменить размер таблицы? Попробуйте использовать
setFixedHeight()
.2. Да, setFixedHeight() ведет себя хорошо. Виджеты не переходят к своим соседям, когда я увеличиваю высоту. Однако, когда я сжимаю firstTableView, после него все еще остается пустое пространство. Выравнивание всех виджетов по верхнему краю не приводит к исправлению оставшегося пространства. Может быть, корректировка политики размера должна помочь?
3. Постарайтесь
addStretch()
scrollAreaWidgetLayout
собрать все ее предметы.4. Да, это сработало, спасибо. Если вы опубликуете его в качестве ответа, я его одобрю.
Ответ №1:
Вы должны использовать setFixedHeight()
вместо resize()
для установки высоты стола. Также вы должны addStretch()
scrollAreaWidgetLayout
выполнить все его пункты.