QDockWidget с QGridLayout - виджет в макете не выравнивается по верху - PullRequest
3 голосов
/ 06 февраля 2012

Я пытаюсь создать закрепляемую панель инструментов (похожую на ту, что вы используете в Photoshop), которая будет содержать сетку кнопок 2 x (n). Моя идея состоит в том, чтобы использовать QGridLayout, связанный с пустым QWidget, который добавляется в QDockWidget, и добавлять кнопки в QGridLayout. Кажется, это работает, за исключением выравнивания.

Я установил выравнивание для кнопок ...

myLayout->addWidget(button1,0,0,1,1,Qt::AlignTop);
myLayout->addWidget(button2,0,1,1,1,Qt::AlignTop);
myLayout->addWidget(button3,1,0,1,1,Qt::AlignTop);
myLayout->addWidget(button4,1,1,1,1,Qt::AlignTop);

... однако сетка расширяется до полной высоты QDockWidget, как показано ниже: enter image description here

Кнопки также расширяются по горизонтали, чтобы заполнить все пространство. Я полагаю, я могу просто ограничить возможность изменить его размер по горизонтали (если это возможно?).

Есть ли функция, которую я пропускаю в документе, чтобы немного лучше контролировать GridLayout, чтобы ограничить его, заполняя всю ширину / высоту родительского виджета? И как побочный вопрос, есть ли способ предотвратить изменение размера QDOckWidget в определенном направлении?

Ответы [ 3 ]

4 голосов
/ 06 февраля 2012

С документация :

QGridLayout занимает выделенное ему пространство (в соответствии с его родительским макетом или parentWidget ()), делит его на строки и столбцы, и помещает каждый виджет, которым он управляет, в правильную ячейку.

Столбцы и строки ведут себя одинаково; мы будем обсуждать столбцы, но есть эквивалентные функции для строк.

Каждый столбец имеет минимальную ширину и коэффициент растяжения. Минимум ширина является наибольшим из этого набора, используя setColumnMinimumWidth () и минимальная ширина каждого виджета в этом столбце. Коэффициент растяжения установить с помощью setColumnStretch () и определяет, сколько из доступных пробел столбец будет превышать необходимый минимум.

Так что самым простым способом было бы использовать фиксированный размер закрепляемого виджета QWidget :: setFixedSize . В общем, я бы не рекомендовал это (управление макетом), но он идеально подходит для вашего случая по следующим причинам:

  • Все кнопки имеют одинаковый размер, поэтому вы примерно знаете размер панели инструментов в зависимости от количества кнопок.
  • вам не нужно управлять поведением макета.
  • Вы можете сделать это с любым измерением или с обоими

Например, при добавлении кнопки

  void addButton(QWidget* w,QGridLayout* wl, QButton* button, posParams...){
       // w is the widget inside the QDockWidget (edit)
       //wl is w layout
       //break the constraints, the widget can be resized
       w->setFixedSize(QSize(QWIDGETSIZE_MAX,QWIDGETSIZE_MAX));
       // only line to change if you want to hide, remove widget
       wl->addWidget(button, params);
       //fit to contents 
       w->adjustSize();
       // can be swapped to w->setFixedHeight, setFixedWidth
       w->setFixedSize(w->size());
  }

Попробуйте и убедитесь, что вещи не портятся, когда вы подключаете и отсоединяете виджет после модификации. Вы должны заметить, что нарушение ограничения также нарушает расположение.

В общем, существует иерархия между QLayout :: SizeConstraint , QWidget ::imumSizeHint , QWidget ::imumSize , и вы можете найти ее в документации .

  • QWidget::minimumSize не установлено по умолчанию. Когда это так, оно превалирует над QWidget::minimumSizeHint
  • QWidget::minimumSizeHint недопустимо, если виджет не находится в макете (это означает, что он может быть изменен до 0 с помощью мыши), в противном случае используйте тот, который определен макетом.
  • QLayout::SizeConstraint содержит поведение макета по умолчанию для виджетов, которыми он * напрямую * управляет. Если вы вложите макет A в макет B, все виджеты, добавленные в A, будут использовать его свойство. Кроме того, если виджет W в B определяет свой собственный макет, то это ограничения макета должны применяться к виджету W.
2 голосов
/ 06 февраля 2012

Используйте QVBoxLayout, где вы сначала добавляете QGridLayout, а затем добавляете растяжку следующим образом:

my_vboxlayout->addLayout( my_gridlayout );
my_vboxlayout->addStretch( 1 );

В качестве альтернативы вы можете сообщить своему QGridLayout, что последний ряд должен увеличиться до максимального размера, что приведет к нажатию кнопок.
В вашем случае это будет:

mygridlayout->setRowStretch( 2, 1 ); // give 3rd row maximum space

Ссылки на документацию:
QBoxLayout
QGridLayout

0 голосов
/ 01 марта 2017

Вставьте вертикальную прокладку ниже.
enter image description here

...