Qt: в чем разница между макетом и виджетом? - PullRequest
7 голосов
/ 09 апреля 2010

Я думал, что макет - это просто виджет, который содержит больше виджетов внутри. Но теперь я обнаружил, что не могу добавить его в другие виджеты, используя addWidget. Например, как добавить макет в QSplitter?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2010

QWidget имеет встроенную поддержку макетов с помощью функций layout() и setLayout(...). Объект макета управляет позиционированием различных дочерних виджетов, которые могут быть добавлены в макет. Кроме того, он обеспечивает правильный размер родительского виджета в соответствии с указанными ограничениями . Если в макете еще нет родительского виджета, то, как только макет будет присоединен к виджету с помощью setLayout(), он установит размер этого родительского виджета.

Но некоторые виджеты больше похожи на менеджер макетов, чем виджеты, такие как QSplitter и QTabWidget . Рассмотрим, например, QSplitter. Хотя один виджет, он представляет две разные области, с которыми можно работать. В этом случае один менеджер макета для двух разных областей не имеет смысла. Как и QSplitter, QTabWidget имеет некоторые поведения, которые делают единый макет не только ненужным, но и бесполезным.

Я думаю, что вышеприведенное сочетание макета и виджета делает разделение макета и виджета иногда запутывающим.

3 голосов
/ 09 апреля 2010

QLayout s - менеджеры по расположению. Они управляют позиционированием и изменением размеров виджетов внутри родительского виджета. Из документов:

Макеты - это элегантный и гибкий способ автоматического размещения дочерних виджетов в своем контейнере. Каждый виджет сообщает свои требования к размеру макету через свойства sizeHint и sizePolicy, и макет соответственно распределяет доступное пространство.

Например, если установить макет виджета на QHBoxLayout, его дочерние виджеты будут расположены горизонтально.

Подробнее об этом можно прочитать здесь .

3 голосов
/ 09 апреля 2010

Нет, макет не является виджетом или контейнером. Макет больше похож на «помощника», который прикреплен к окну и определяет лучшее место для размещения каждого виджета.

Этот пример из документации Qt должен помочь (http://qt.nokia.com/doc/4.2/layout.html):

QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

window->setLayout(layout);
window->show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...