Класс 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() |
| virtual void | addItem(QLayoutItem *item) = 0 |
| void | addWidget(QWidget *w) |
| QMargins | contentsMargins() const |
| QRect | contentsRect() const |
| virtual int | count() const = 0 |
| void | getContentsMargins(int *left, int *top, int *right, int *bottom) const |
| virtual int | indexOf(const QWidget *widget) const |
| virtual int | indexOf(const QLayoutItem *layoutItem) const |
| bool | isEnabled() const |
| virtual QLayoutItem * | itemAt(int index) const = 0 |
| QWidget * | menuBar() const |
| QWidget * | parentWidget() const |
| void | removeItem(QLayoutItem *item) |
| void | removeWidget(QWidget *widget) |
| virtual 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) |
| virtual void | setSpacing(int) |
| QLayout::SizeConstraint | sizeConstraint() const |
| virtual int | spacing() const |
| virtual QLayoutItem * | takeAt(int index) = 0 |
| void | unsetContentsMargins() |
| void | update() |
Переопределённые функции публичного доступа
| virtual QSizePolicy::ControlTypes | controlTypes() const override |
| virtual Qt::Orientations | expandingDirections() const override |
| virtual QRect | geometry() const override |
| virtual void | invalidate() override |
| virtual bool | isEmpty() const override |
| virtual QLayout * | layout() override |
| virtual QSize | maximumSize() const override |
| virtual QSize | minimumSize() const override |
| virtual 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 |
Переопределённые защищённые функции
| virtual 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, Управление компоновкой, Пример базовых компоновок, Пример компоновки Border Layout и Пример компоновки Flow Layout.
Документация по типам членов
перечисление 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)
Должно быть реализовано в подклассах для удаления элемента макета по индексу index из макета и возврата элемента. Если такого элемента нет, функция ничего не должна делать и вернуть 0. Элементы нумеруются последовательно, начиная с 0. При удалении элемента другие элементы будут переиндексированы.
Следующий фрагмент кода демонстрирует безопасный способ удаления всех элементов из макета:
QLayoutItem *child;
while ((child = layout->takeAt(0)) != nullptr) {
...
delete child->widget(); // delete the widget
delete child; // delete the layout item
}
[since 6.1] void QLayout::unsetContentsMargins()
Снимает все пользовательские отступы вокруг макета. Макет будет использовать значения по умолчанию, заданные стилем.
Примечание: Функция сброса для свойства contentsMargins.
Данная функция была введена в Qt 6.1.
См. также setContentsMargins().
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.2/qlayout.html