Заставить QTableWidget расширяться при изменении размера диалогового окна

введите здесь описание изображенияУ меня есть кнопки QTableWidget, QTextEdit и кнопки "Отмена" и "ОК".

Я хочу, чтобы эти виджеты оставались в одном и том же положении относительно друг друга, а QTableWidget расширялся, если диалоговое окно расширяется или размер изменяется...

Как я могу это сделать?


person PeterG    schedule 09.11.2011    source источник


Ответы (1)


Вам нужно изучить систему компоновки Qt — использование макетов будет обрабатываться автоматически изменение размера ваших объектов в зависимости от размера их родителя.

Сочетание использования QWidget::setSizePolicy() и QBoxLayout::setStretch() (или, что более вероятно, QBoxLayout::insertWidget(..., int stretch = 0, ...)) позволит вам достичь поведение, на которое вы ссылаетесь, когда только определенные объекты расширяются, чтобы заполнить доступное пространство, в то время как другие остаются постоянного размера.

Обращение к изображению, которое вы привели выше в качестве примера:

Пример решения в QtDesigner

Помимо перетаскивания объектов в форму, для достижения этого решения у меня есть:

  • Установите вертикальный sizePolicy из textEdit на Fixed.
  • Установите высоту в minimumSize textEdit для использования sizePolicy.
  • Установите layoutStretch в centralWidget на 1,0, т.е. назначьте минимально возможное пространство для элементов, содержащихся в horizontalLayout, и отдайте оставшееся место tableWidget.
person sam-w    schedule 09.11.2011
comment
QGridLayout *layout=новый QGridLayout(); ui-›tableWidget-›setSizePolicy(QSizePolicy::Expanding); layout-›addWidget(ui-›tableWidget,0,0,-1,-1,Qt::AlignVCenter); layout-›addWidget(ui-›textEdit_2,1,0,1,2,Qt::AlignLeft); layout-›addWidget(ui-›cancel,1,1); layout-›addWidget(ui-›ok,1,2); this-›setLayout(макет); но это не создает то, что я хочу. каждый из виджетов не заполняет доступное пространство. для каждого виджета создается только маленькое поле. Как заполнить виджет каждой ячейкой сетки? и QWidget setSizePolicy() дал мне ошибку своего частного и не может быть использован. - person PeterG; 10.11.2011
comment
У вас правильная идея, но если вы используете Qt Designer для компоновки своих виджетов, вы можете добавьте макеты и укажите коэффициенты растяжения и т. д., а также задайте sizePolicies (с помощью редактора свойств), не выходя из Designer. Другим преимуществом этого является то, что вы сможете увидеть эффект всех изменений, которые вы вносите, без необходимости создавать свое приложение. - person sam-w; 10.11.2011
comment
поэтому я попытался с настройками макета в дизайнере, и у меня есть виджеты в виде сетки, но размеры ячеек не меняются. Если посмотреть на мою картинку, я хотел, чтобы мой textEdit был узким и длинным, а таблица была большой... сетка не позволяет мне это сделать... не знаю почему. как бы мне подогнать размеры? - person PeterG; 10.11.2011
comment
основываясь на вашем изображении выше, я бы не рекомендовал использовать QGridLayout, а вместо этого вкладывать ваш QTableWidget вместе с QHBoxLayout, содержащим ваши другие виджеты, в QVBoxLayout. Смотрите обновление к моему ответу выше. - person sam-w; 10.11.2011
comment
поэтому я попробовал то, что вы предложили, textEdit, виджеты и кнопки остаются в нужном месте и имеют правильные размеры. Тем не менее, они остаются статичными, когда я увеличиваю диалоговое окно... и табличный виджет больше не создает автоматически полосы прокрутки, когда я минимизирую окно до размера, меньшего, чем исходный размер табличного виджета... (это работало, когда я использовал gridLayout) - person PeterG; 10.11.2011
comment
похоже, проблема в том, что ваш QVBoxLayout не размещает виджет верхнего уровня вашей формы, а один ниже по иерархии - поэтому нет ничего, что могло бы привязать размер вашего окна к размеру других ваших виджетов. Ваш инспектор объектов выглядит точно как мой пример выше, или есть какие-то отличия? - person sam-w; 10.11.2011
comment
это должно быть в классе mainWindow? потому что у меня есть мой в диалоговом классе... кроме этого, все идентично... - person PeterG; 14.11.2011
comment
Итак, я попробовал это с классом mainWindow в новом проекте, и это сработало... я думаю, это QmainWindow, у которого есть функциональность, которую я хочу? - person PeterG; 14.11.2011
comment
Нет, это будет работать в любом виджете. Что, вероятно, неясно из моего примера выше, так это то, что centralWidget фактически является виджетом верхнего уровня для MainWindow. Вам просто нужно убедиться, что ваш виджет верхнего уровня (каким бы он ни был) имеет макет. Я подозреваю, что мой пример привел вас к созданию нового QWidget в вашем QDialog, а не QDialog вместо centralWidget. Я изменю свой пример. - person sam-w; 14.11.2011
comment
ладно теперь все работает! уф, наконец-то это заработало с вашей очень признательной помощью ... Я знаю, что это что-то очень простое, но я такой нуб. Спасибо за ваше время и беспокойство! - person PeterG; 14.11.2011