Класс QLayout
Класс QLayout является базовым классом менеджеров геометрии. Подробнее...
| Заголовок: | #include <QLayout> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследует: | QObject и QLayoutItem |
| Наследуется от: |
Типы публичного доступа
| Перечисление | SizeConstraint { SetDefaultConstraint, SetFixedSize, SetMinimumSize, SetMaximumSize, SetMinAndMaxSize, SetNoConstraint } |
Свойства
- sizeConstraint : SizeConstraint
- spacing : int
Публичные функции
| QLayout(QWidget *parent = nullptr) | |
| bool | activate() |
| виртуальный void | addItem(QLayoutItem *item) = 0 |
| void | addWidget(QWidget *w) |
| QMargins | contentsMargins() const |
| QRect | contentsRect() const |
| виртуальный int | count() const = 0 |
| void | getContentsMargins(int *left, int *top, int *right, int *bottom) const |
| виртуальный int | indexOf(const QWidget *widget) const |
| виртуальный int | indexOf(const QLayoutItem *layoutItem) const |
| bool | isEnabled() const |
| виртуальный QLayoutItem * | itemAt(int index) const = 0 |
| QWidget * | menuBar() const |
| QWidget * | parentWidget() const |
| void | removeItem(QLayoutItem *item) |
| void | removeWidget(QWidget *widget) |
| виртуальный QLayoutItem * | replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively) |
| bool | setAlignment(QWidget *w, Qt::Alignment alignment) |
| bool | setAlignment(QLayout *l, Qt::Alignment alignment) |
| void | setContentsMargins(int left, int top, int right, int bottom) |
| void | setContentsMargins(const QMargins &margins) |
| void | setEnabled(bool enable) |
| void | setMenuBar(QWidget *widget) |
| void | setSizeConstraint(QLayout::SizeConstraint) |
| виртуальный void | setSpacing(int) |
| QLayout::SizeConstraint | sizeConstraint() const |
| виртуальный int | spacing() const |
| виртуальный QLayoutItem * | takeAt(int index) = 0 |
| void | update() |
Переопределённые публичные функции
| виртуальный QSizePolicy::ControlTypes | controlTypes() const override |
| виртуальный Qt::Orientations | expandingDirections() const override |
| виртуальный QRect | geometry() const override |
| виртуальный void | invalidate() override |
| виртуальный bool | isEmpty() const override |
| виртуальный QLayout * | layout() override |
| виртуальный QSize | maximumSize() const override |
| виртуальный QSize | minimumSize() const override |
| виртуальный void | setGeometry(const QRect &r) override |
Статические публичные члены
| QSize | closestAcceptableSize(const QWidget *widget, const QSize &size) |
Защищённые функции
| void | addChildLayout(QLayout *l) |
| void | addChildWidget(QWidget *w) |
| QRect | alignmentRect(const QRect &r) const |
Переопределённые защищённые функции
| виртуальный void | childEvent(QChildEvent *e) override |
Подробное описание
Это абстрактный базовый класс, унаследованный конкретными классами QBoxLayout, QGridLayout, QFormLayout и QStackedLayout.
Для пользователей подклассов QLayout или QMainWindow редко есть необходимость использовать базовые функции, предоставляемые QLayout, такие как setSizeConstraint() или setMenuBar(). Подробнее см. Управление макетом.
Чтобы создать собственный менеджер макета, реализуйте функции addItem(), sizeHint(), setGeometry(), itemAt() и takeAt(). Также необходимо реализовать minimumSize(), чтобы убедиться, что ваш макет не будет изменён до размера нулевой площади, если места недостаточно. Чтобы поддерживать элементы, высота которых зависит от ширины, реализуйте hasHeightForWidth() и heightForWidth(). Дополнительную информацию об реализации пользовательских менеджеров макета см. в примерах Border Layout и Flow Layout.
Управление геометрией останавливается при удалении менеджера макета.
См. также QLayoutItem, Управление макетом, Пример базовых макетов, Пример макета с границами и Пример макета с потоком.
Документация по типам элементов
перечисление QLayout::SizeConstraint
Возможные значения:
| Константа | Значение | Описание |
|---|---|---|
QLayout::SetDefaultConstraint |
0 |
Минимальный размер основного виджета устанавливается в minimumSize(), если у виджета ещё нет минимального размера. |
QLayout::SetFixedSize |
3 |
Размер основного виджета устанавливается в sizeHint(); он не может быть изменён. |
QLayout::SetMinimumSize |
2 |
Минимальный размер основного виджета устанавливается в minimumSize(); он не может быть меньше. |
QLayout::SetMaximumSize |
4 |
Максимальный размер основного виджета устанавливается в maximumSize(); он не может быть больше. |
QLayout::SetMinAndMaxSize |
5 |
Минимальный размер основного виджета устанавливается в minimumSize(), а максимальный - в maximumSize(). |
QLayout::SetNoConstraint |
1 |
Виджет не ограничен. |
См. также setSizeConstraint().
Документация по свойствам
sizeConstraint : SizeConstraint
Это свойство определяет режим изменения размера макета.
По умолчанию используется режим SetDefaultConstraint.
Функции доступа:
| QLayout::SizeConstraint | sizeConstraint() const |
| void | setSizeConstraint(QLayout::SizeConstraint) |
spacing : int
Это свойство содержит отступ между виджетами внутри макета.
Если значение не установлено явно, отступ макета наследуется от родительского макета или из настроек стиля родительского виджета.
Для QGridLayout и QFormLayout можно установить разные горизонтальные и вертикальные отступы, используя setHorizontalSpacing() и setVerticalSpacing(). В этом случае spacing() возвращает -1.
Функции доступа:
| virtual int | spacing() const |
| virtual void | setSpacing(int) |
См. также contentsRect(), getContentsMargins(), QStyle::layoutSpacing() и QStyle::pixelMetric().
Документация по функциям
QLayout::QLayout(QWidget *parent = nullptr)
Создаёт новый QLayout верхнего уровня с родителем parent.
Макет устанавливается непосредственно в качестве верхнего уровня для parent. Для виджета может быть только один макет верхнего уровня. Он возвращается функцией QWidget::layout().
Если parent является nullptr, то необходимо вставить этот макет в другой макет или установить его в качестве макета виджета с помощью QWidget::setLayout().
См. также QWidget::setLayout().
bool QLayout::activate()
Пересчитывает макет для parentWidget(), если это необходимо.
Как правило, вызывать эту функцию не требуется, так как она вызывается автоматически в наиболее подходящих случаях. Она возвращает true, если макет был пересчитан.
См. также update() и QWidget::updateGeometry().
[protected] void QLayout::addChildLayout(QLayout *l)
Эта функция вызывается из функций addLayout() или insertLayout() в подклассах для добавления макета l в качестве подмакета.
Единственный случай, когда вам нужно вызывать её напрямую, — это если вы реализуете пользовательский макет, поддерживающий вложенные макеты.
См. также QBoxLayout::addLayout(), QBoxLayout::insertLayout() и QGridLayout::addLayout().
[protected] void QLayout::addChildWidget(QWidget *w)
Эта функция вызывается из функций addWidget() в подклассах для добавления w в качестве управляемого виджета макета.
Если w уже управляется макетом, эта функция выведет предупреждение и удалит w из этого макета. Поэтому эта функция должна быть вызвана до добавления w в структуру данных макета.
[pure virtual] void QLayout::addItem(QLayoutItem *item)
Реализуется в подклассах для добавления item. Способ добавления зависит от каждого подкласса.
Эта функция обычно не вызывается в прикладном коде. Для добавления виджета в макет используйте функцию addWidget(); для добавления дочернего макета используйте функцию addLayout(), предоставляемую соответствующим подклассом QLayout.
Примечание: Владение item передаётся макету, и макет отвечает за его удаление.
См. также addWidget(), QBoxLayout::addLayout() и QGridLayout::addLayout().
void QLayout::addWidget(QWidget *w)
Добавляет виджет w в этот макет, в соответствии со спецификой макета. Эта функция использует addItem().
[protected] QRect QLayout::alignmentRect(const QRect &r) const
Возвращает прямоугольник, который должен быть покрыт, когда геометрия этого макета устанавливается в r, при условии, что этот макет поддерживает setAlignment().
Результат выводится из sizeHint() и expanding(). Он никогда не больше, чем r.
[override virtual protected] void QLayout::childEvent(QChildEvent *e)
Переопределяет: QObject::childEvent(QChildEvent *event).
[static] QSize QLayout::closestAcceptableSize(const QWidget *widget, const QSize &size)
Возвращает размер, который удовлетворяет всем ограничениям размера для widget, включая heightForWidth(), и максимально приближен к size.
QMargins QLayout::contentsMargins() const
Возвращает отступы, используемые вокруг макета.
По умолчанию QLayout использует значения, предоставленные стилем. На большинстве платформ отступ составляет 11 пикселей во всех направлениях.
Примечание: Функция-получатель для свойства contentsMargins.
См. также setContentsMargins().
QRect QLayout::contentsRect() const
Возвращает прямоугольник geometry() макета, но учитывая отступы содержимого.
См. также setContentsMargins() и getContentsMargins().
[override virtual] QSizePolicy::ControlTypes QLayout::controlTypes() const
Переопределяет: QLayoutItem::controlTypes() const.
[pure virtual] int QLayout::count() const
Должно быть реализовано в подклассах для возврата количества элементов в макете.
См. также itemAt().
[override virtual] Qt::Orientations QLayout::expandingDirections() const
Переопределяет: QLayoutItem::expandingDirections() const.
Возвращает, может ли этот макет использовать больше места, чем sizeHint(). Значение Qt::Vertical или Qt::Horizontal означает, что он хочет расти только в одном измерении, а Qt::Vertical | Qt::Horizontal означает, что он хочет расти в обоих измерениях.
По умолчанию реализация возвращает Qt::Horizontal | Qt::Vertical. Подклассы переопределяют её, чтобы возвращать осмысленное значение, основанное на политиках размера дочерних виджетов size policies.
См. также sizeHint().
[override virtual] QRect QLayout::geometry() const
Переопределяет: QLayoutItem::geometry() const.
См. также setGeometry().
void QLayout::getContentsMargins(int *left, int *top, int *right, int *bottom) const
Для каждого из left, top, right и bottom, который не nullptr, сохраняет размер отступа, указанного в месте, к которому ссылается указатель.
По умолчанию QLayout использует значения, заданные стилем. На большинстве платформ отступ составляет 11 пикселей во всех направлениях.
См. также setContentsMargins(), QStyle::pixelMetric(), PM_LayoutLeftMargin, PM_LayoutTopMargin, PM_LayoutRightMargin и PM_LayoutBottomMargin.
[virtual] int QLayout::indexOf(const QWidget *widget) const
Ищет виджет widget в этом макете (без учета дочерних макетов).
Возвращает индекс widget или -1, если widget не найден.
По умолчанию реализация итерируется по всем элементам с помощью itemAt().
[virtual, since 5.12] int QLayout::indexOf(const QLayoutItem *layoutItem) const
Ищет элемент макета layoutItem в этом макете (без учета дочерних макетов).
Возвращает индекс layoutItem или -1, если layoutItem не найден.
Эта функция была добавлена в Qt 5.12.
[override virtual] void QLayout::invalidate()
Переопределяет: QLayoutItem::invalidate().
[override virtual] bool QLayout::isEmpty() const
Переопределяет: QLayoutItem::isEmpty() const.
bool QLayout::isEnabled() const
Возвращает true если макет включен; в противном случае возвращает false.
См. также setEnabled().
[pure virtual] QLayoutItem *QLayout::itemAt(int index) const
Должно быть реализовано в подклассах для возврата элемента макета по индексу index. Если такого элемента нет, функция должна возвратить nullptr. Элементы нумеруются последовательно от 0. Если элемент удален, другие элементы будут переиндексированы.
Эта функция может быть использована для итерации по макету. Следующий код нарисует прямоугольник для каждого элемента макета в структуре макета виджета.
static void paintLayout(QPainter *painter, QLayoutItem *item)
{
QLayout *layout = item->layout();
if (layout) {
for (int i = 0; i < layout->count(); ++i)
paintLayout(painter, layout->itemAt(i));
}
painter->drawRect(item->geometry());
}
void MyWidget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
if (layout())
paintLayout(&painter, layout());
}
[override virtual] QLayout *QLayout::layout()
Переопределяет: QLayoutItem::layout().
[override virtual] QSize QLayout::maximumSize() const
Переопределяет: QLayoutItem::maximumSize() const.
Возвращает максимальный размер этого макета. Это наибольший размер, который может иметь макет, соблюдая все спецификации.
Возвращаемое значение не включает пространство, необходимое для QWidget::setContentsMargins() или menuBar().
По умолчанию реализация допускает неограниченное изменение размера.
QWidget *QLayout::menuBar() const
Возвращает панель меню, установленную для этого макета, или nullptr если панель меню не установлена.
См. также setMenuBar().
[override virtual] QSize QLayout::minimumSize() const
Переопределяет: QLayoutItem::minimumSize() const.
Возвращает минимальный размер этого макета. Это наименьший размер, который может иметь макет, соблюдая все спецификации.
Возвращаемое значение не включает пространство, необходимое для QWidget::setContentsMargins() или menuBar().
По умолчанию реализация допускает неограниченное изменение размера.
QWidget *QLayout::parentWidget() const
Возвращает родительский виджет этого макета или nullptr если этот макет не установлен на каком-либо виджете.
Если макет является дочерним макетом, эта функция возвращает родительский виджет родительского макета.
См. также parent().
void QLayout::removeItem(QLayoutItem *item)
Удаляет элемент макета item из макета. Ответственность за удаление элемента лежит на вызывающей стороне.
Обратите внимание, что item может быть макетом (так как QLayout наследует от QLayoutItem).
См. также removeWidget() и addItem().
void QLayout::removeWidget(QWidget *widget)
Удаляет виджет widget из макета. После этого вызова ответственность за придание виджету разумной геометрии или размещение виджета обратно в макет или явное скрытие его при необходимости лежит на вызывающей стороне.
Примечание: Владение widget остаётся таким же, как и при добавлении.
См. также removeItem(), QWidget::setGeometry() и addWidget().
[virtual, since 5.2] QLayoutItem *QLayout::replaceWidget(QWidget *from, QWidget *to, Qt::FindChildOptions options = Qt::FindChildrenRecursively)
Ищет виджет from и заменяет его на виджет to, если найден. Возвращает элемент макета, содержащий виджет from при успехе. В противном случае возвращается nullptr. Если options содержит Qt::FindChildrenRecursively (по умолчанию), выполняется поиск в подмакетах для замены. Любые другие флаги в options игнорируются.
Обратите внимание, что возвращаемый элемент, следовательно, может не принадлежать этому макету, а подмакету.
Возвращаемый элемент макета больше не принадлежит макету и должен быть удалён или вставлен в другой макет. Виджет from больше не управляется макетом и может потребоваться удалить или скрыть. Родитель виджета from остаётся неизменным.
Эта функция работает для встроенных макетов Qt, но может не работать для пользовательских макетов.
Эта функция была добавлена в Qt 5.2.
См. также indexOf().
bool QLayout::setAlignment(QWidget *w, Qt::Alignment alignment)
Устанавливает выравнивание для виджета w на alignment и возвращает true, если w найден в этом макете (без учета дочерних макетов); в противном случае возвращает false.
bool QLayout::setAlignment(QLayout *l, Qt::Alignment alignment)
Это перегруженная функция.
Устанавливает выравнивание для макета l на alignment и возвращает true если l найден в этом макете (без учета дочерних макетов); в противном случае возвращает false.
void QLayout::setContentsMargins(int left, int top, int right, int bottom)
Устанавливает отступы left, top, right и bottom для использования вокруг макета.
По умолчанию QLayout использует значения, заданные стилем. На большинстве платформ отступ составляет 11 пикселей во всех направлениях.
Примечание: Функция-сеттер для свойства contentsMargins.
См. также contentsMargins(), getContentsMargins(), QStyle::pixelMetric(), PM_LayoutLeftMargin, PM_LayoutTopMargin, PM_LayoutRightMargin и PM_LayoutBottomMargin.
void QLayout::setContentsMargins(const QMargins &margins)
Устанавливает отступы вокруг макета.
По умолчанию, QLayout использует значения, предоставленные стилем. На большинстве платформ отступ составляет 11 пикселей во всех направлениях.
Примечание: Функция-сеттер для свойства contentsMargins.
См. также contentsMargins().
void QLayout::setEnabled(bool enable)
Включает этот макет, если enable равно true, иначе отключает его.
Включенный макет динамически реагирует на изменения; отключенный макет ведет себя так, как будто его не существует.
По умолчанию все макеты включены.
См. также isEnabled().
[override virtual] void QLayout::setGeometry(const QRect &r)
Переопределяет: QLayoutItem::setGeometry(const QRect &r).
См. также geometry().
void QLayout::setMenuBar(QWidget *widget)
Указывает менеджеру геометрии поместить виджет widget (панель меню) вверху parentWidget(), вне QWidget::contentsMargins(). Все дочерние виджеты размещаются под нижним краем панели меню.
См. также menuBar().
[pure virtual] QLayoutItem *QLayout::takeAt(int index)
Должен быть реализован в подклассах для удаления элемента макета в индексе из макета и возврата элемента. Если такого элемента нет, функция должна ничего не делать и вернуть 0. Элементы нумеруются последовательно, начиная с 0. Если элемент удален, другие элементы будут переиндексированы.
Следующий фрагмент кода демонстрирует безопасный способ удаления всех элементов из макета:
QLayoutItem *child;
while ((child = layout->takeAt(0)) != nullptr) {
...
delete child->widget(); // delete the widget
delete child; // delete the layout item
} void QLayout::update()
Обновляет макет для parentWidget().
Как правило, вам не нужно вызывать эту функцию, так как она автоматически вызывается в наиболее подходящее время.
См. также activate() и invalidate().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qlayout.html