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

#qt #qwidget

#qt #qwidget

Вопрос:

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

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

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

Ответ №1:

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

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

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

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

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

  • Установите для sizePolicy из textEdit по вертикали значение Fixed .
  • Задайте высоту в textEdit ‘s minimumSize для sizePolicy использования.
  • Установите layoutStretch в centralWidget значение 1,0 , т.е. выделите минимально возможное пространство для элементов, содержащихся в horizontalLayout , и предоставьте все оставшееся пространство tableWidget .

Комментарии:

1. QGridLayout *layout=new QGridLayout(); пользовательский интерфейс-> tableWidget->setSizePolicy(QSizePolicy::Expanding); макет-> addWidget (пользовательский интерфейс-> tableWidget,0,0,-1,-1, Qt::AlignVCenter); макет-> addWidget (пользовательский интерфейс-> textEdit_2,1,0,1,2, Qt::AlignLeft); layout-> addWidget (ui-> отмена, 1, 1); layout-> addWidget (ui->ok, 1,2); this-> setLayout (макет); но это не создает того, что я хочу. каждый из виджетов не заполняет доступное пространство. для каждого виджета создается только небольшое окно. Как мне заполнить виджет в каждой ячейке сетки? и QWidget setSizePolicy () выдал мне ошибку о его закрытии и не может быть использован..

2. У вас правильная идея, но если вы используете Qt Designer для размещения своих виджетов, вы можете добавить макеты и указать коэффициенты растяжения и т.д. , А также задать политики размеров (с помощью редактора свойств), Не выходя из Designer. Другим преимуществом этого является то, что вы сможете увидеть эффект от всех вносимых вами изменений без необходимости создавать свое приложение.

3. итак, я попробовал с настройками макета в конструкторе, и у меня есть мои виджеты в виде сетки, но размеры ячеек не меняются. Если вы видите мою картинку, я хотел, чтобы мой TextEdit был узким и длинным, а таблица — большой… сетка не позволяет мне этого сделать … idk почему. как бы мне настроить размеры?

4. основываясь на вашем изображении выше, я бы не рекомендовал использовать QGridLayout , а вместо этого вложил ваш QTableWidget вместе с QHBoxLayout , содержащим другие ваши виджеты внутри QVBoxLayout . Смотрите обновление к моему ответу выше.

5. итак, я попробовал то, что вы предложили, TextEdit, виджеты и кнопки остаются в нужном месте и имеют правильные размеры. Однако они остаются статичными, когда я увеличиваю диалоговое окно … и tablewidget больше не будет автоматически создавать полосы прокрутки, когда я сворачиваю окно до размера, меньшего исходного размера tablewidget … (это работало, когда я использовал GridLayout)