Я думал, что расположение является просто виджетом, который держит больше виджетов внутри. Но теперь я нахожу, что не могу добавить его к другим виджетам с помощью addWidget. Например, как добавить расположение к QSplitter?
QWidget имеет встроенную поддержку макетов через layout()
и setLayout(...)
функции. Объект макета управляет позиционированием различных дочерних виджетов, которые могут быть добавлены в макет. Кроме того, он следит за тем, чтобы правильно оразмерлять родительский виджет на основе указанных ограничений . Если макет еще не имеет родительского виджета, то, как только макет будет прикреплен к виджету с setLayout()
, он установит размер этого родительского виджета.
Но некоторые виджеты больше похожи на менеджер макета, чем на виджет, такие как QSplitter и QTabWidget. Рассмотрим, например, QSplitter. Несмотря на то, что это один виджет, он представляет две разные области, с которыми можно работать. В этом случае единый менеджер макета для двух разных областей на самом деле не имеет смысла. Как и QSplitter, QTabWidget имеет некоторые варианты поведения, которые делают один макет не только ненужным, но и бесполезным.
Я думаю, что именно приведенное выше слияние макета и виджета делает разделение макета и виджета иногда запутанным.
Нет, макет - это не виджет или контейнер. Макет больше похож на «помощника», который прикрепляется к окну и определяет наилучшее место для размещения каждого виджета.
Этот пример из документации 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();
QLayout
- это менеджеры компоновки.Они управляют размещением и изменением размеров виджетов внутри родительского виджета. Из документации:
Макеты - это элегантный и гибкий способ автоматического размещения дочерних виджетов в их контейнере. Каждый виджет сообщает свои требования к размеру макету через свойства sizeHint и sizePolicy, и макет распределяет доступное пространство соответствующим образом.
Например, установка макета виджета на QHBoxLayout
приведет к тому, что его дочерние виджеты будут расположены горизонтально.
Подробнее об этом можно прочитать здесь .