Класс QGraphicsLayout
Класс QGraphicsLayout предоставляет базовый класс для всех компоновок в представлении графики. Подробнее...
| Заголовок: | #include <QGraphicsLayout> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследуется от: | QGraphicsLayoutItem |
| Наследует: | QGraphicsAnchorLayout, QGraphicsGridLayout и QGraphicsLinearLayout |
Открытые функции
| QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr) | |
| virtual | ~QGraphicsLayout() |
| void | activate() |
| virtual int | count() const = 0 |
| virtual void | invalidate() |
| bool | isActivated() const |
| virtual QGraphicsLayoutItem * | itemAt(int i) const = 0 |
| virtual void | removeAt(int index) = 0 |
| void | setContentsMargins(qreal left, qreal top, qreal right, qreal bottom) |
| virtual void | widgetEvent(QEvent *e) |
Переопределённые открытые функции
| virtual void | getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override |
| virtual void | updateGeometry() override |
Защищённые функции
| void | addChildLayoutItem(QGraphicsLayoutItem *layoutItem) |
Подробное описание
QGraphicsLayout — это абстрактный класс, который определяет виртуальный API для упорядочения дочерних элементов QGraphicsWidget и других объектов QGraphicsLayoutItem для QGraphicsWidget. QGraphicsWidget делегирует ответственность классу QGraphicsLayout через QGraphicsWidget::setLayout(). При изменении размера виджета компоновка автоматически упорядочит дочерние элементы виджета. QGraphicsLayout наследует от QGraphicsLayoutItem, поэтому его можно управлять любой компоновкой, включая его собственные подклассы.
Создание пользовательской компоновки
Вы можете использовать QGraphicsLayout в качестве основы для создания собственной пользовательской компоновки (например, flowlayout), но чаще всего используется один из его подклассов — QGraphicsLinearLayout или QGraphicsGridLayout. При создании пользовательской компоновки необходимо, как минимум, переопределить следующие функции:
| Функция | Описание |
|---|---|
| QGraphicsLayoutItem::setGeometry() | Уведомляет вас, когда устанавливается геометрия компоновки. Вы можете сохранить геометрию в собственном классе компоновки в переопределении этой функции. |
| QGraphicsLayoutItem::sizeHint() | Возвращает подсказки размера компоновки. |
| QGraphicsLayout::count() | Возвращает количество элементов в компоновке. |
| QGraphicsLayout::itemAt() | Возвращает указатель на элемент в компоновке. |
| QGraphicsLayout::removeAt() | Удаляет элемент из компоновки без его уничтожения. |
Для получения дополнительных сведений о реализации каждой функции см. документацию по отдельной функции.
Каждая компоновка определяет свой собственный API для упорядочения виджетов и элементов компоновки. Например, для сетки требуется номер строки и столбца с необязательными пролетами строки и столбца, выравниванием, интервалами и т. д. Для линейной компоновки требуется только номер строки или столбца для позиционирования элементов. Для сетки порядок вставки не влияет на компоновку, но для линейной компоновки порядок важен. При написании собственного подкласса компоновки вы можете выбрать API, который лучше всего соответствует вашей компоновке.
QGraphicsLayout предоставляет удобную функцию addChildLayoutItem() для добавления элементов компоновки в пользовательскую компоновку. Функция автоматически переродится графические элементы, если необходимо.
Активация компоновки
При изменении геометрии компоновки QGraphicsLayout сразу же переупорядочивает все управляемые элементы, вызывая setGeometry() для каждого элемента. Это переупорядочивание называется активацией компоновки.
QGraphicsLayout обновляет свою собственную геометрию, чтобы соответствовать contentsRect() элемента QGraphicsLayoutItem, который он управляет. Таким образом, он автоматически переупорядочивает все свои элементы при изменении размера виджета. QGraphicsLayout кэширует размеры всех управляемых элементов, чтобы избежать слишком частых вызовов setGeometry().
Примечание: QGraphicsLayout будет иметь ту же геометрию, что и contentsRect() виджета (не компоновки), которому он назначен.
Неявная активация компоновки
Компоновку можно активировать неявно двумя способами: вызвав activate() или invalidate(). Вызов activate() активирует компоновку немедленно. В противоположность этому, вызов invalidate() отложен, так как он публикует событие LayoutRequest для управляемого виджета. Из-за сжатия событий activate() будет вызван только один раз после возвращения управления циклу событий. Это называется аннулированием компоновки. Аннулирование компоновки также аннулирует любые кешированные данные. Кроме того, функция invalidate() является виртуальной. Таким образом, вы можете аннулировать свой собственный кэш в подклассе QGraphicsLayout, переопределяя эту функцию.
Обработка событий
QGraphicsLayout прослушивает события для управляемого им виджета через виртуальный обработчик событий widgetEvent(). Когда компоновка назначена виджету, все события, передаваемые виджету, сначала обрабатываются widgetEvent(). Это позволяет компоновке быть осведомленной обо всех значимых изменениях состояния виджета, таких как изменения видимости или направления компоновки.
Обработка отступов
Отступы QGraphicsLayout можно изменить, переопределив setContentsMargins() и getContentsMargins().
Документация по функциям-членам
QGraphicsLayout::QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)
Создаёт объект QGraphicsLayout.
parent передаётся конструктору QGraphicsLayoutItem, и аргумент isLayout элемента QGraphicsLayoutItem устанавливается в true.
Если parent является QGraphicsWidget, компоновка будет установлена на этом виджете. (Обратите внимание, что установка компоновки удалит старую установленную.)
[virtual] QGraphicsLayout::~QGraphicsLayout()
Уничтожает объект QGraphicsLayout.
void QGraphicsLayout::activate()
Активирует компоновку, вызывая немедленное переупорядочивание всех элементов в компоновке. Эта функция основана на вызове count() и itemAt(), а затем вызове setGeometry() для всех элементов последовательно. При активации компоновка скорректирует свою геометрию в соответствии с contentsRect() родительского элемента. Затем родительский элемент аннулирует любую свою компоновку.
Если вызов производится последовательно или рекурсивно, например, одним из элементов в ответ на изменение размера, эта функция ничего не сделает.
Обратите внимание, что макет свободно использует кэширование геометрии для оптимизации этого процесса. Чтобы принудительно аннулировать такой кэш, можно вызвать invalidate() перед вызовом activate().
См. также invalidate().
[protected] void QGraphicsLayout::addChildLayoutItem(QGraphicsLayoutItem *layoutItem)
Эта функция является вспомогательной функцией, предоставляемой для пользовательских макетов, и пройдёт по всем элементам в макете и переродирует их графические элементы в ближайшего предка QGraphicsWidget макета.
Если layoutItem уже находится в другом макете, он будет удалён из этого макета.
Если пользовательские макеты требуют специального поведения, они могут проигнорировать эту функцию и реализовать собственное поведение.
См. также graphicsItem().
[pure virtual] int QGraphicsLayout::count() const
Эта чистая виртуальная функция должна быть переопределена в подклассе QGraphicsLayout для возвращения количества элементов в макете.
Подкласс свободен в выборе способа хранения элементов.
См. также itemAt() и removeAt().
[override virtual] void QGraphicsLayout::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const
Переопределяет: QGraphicsLayoutItem::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const.
[virtual] void QGraphicsLayout::invalidate()
Очищает кэшированную геометрию и информацию о подсказках размера в макете и отправляет событие LayoutRequest управляемому родительскому QGraphicsLayoutItem.
См. также activate() и setGeometry().
bool QGraphicsLayout::isActivated() const
Возвращает true если макет в данный момент активируется; в противном случае, возвращает false. Если макет активируется, это означает, что он в данный момент в процессе переупорядочивания своих элементов (т.е. функция activate() была вызвана и ещё не вернула значение).
См. также activate() и invalidate().
[pure virtual] QGraphicsLayoutItem *QGraphicsLayout::itemAt(int i) const
Эта чистая виртуальная функция должна быть переопределена в подклассе QGraphicsLayout для возвращения указателя на элемент по индексу i. Реализация может предполагать, что i является допустимым (т.е. она учитывает значение count()). Вместе с count() она предоставляет способ итерации по всем элементам в макете.
Подкласс свободен в выборе способа хранения элементов, и визуальная организация не обязательно должна отражаться через эту функцию.
См. также count() и removeAt().
[pure virtual] void QGraphicsLayout::removeAt(int index)
Эта чистая виртуальная функция должна быть переопределена в подклассе QGraphicsLayout для удаления элемента по индексу index. Реализация может предполагать, что index является допустимым (т.е. она учитывает значение count()).
Реализация должна гарантировать, что parentLayoutItem() удалённого элемента не указывает на этот макет, так как элемент считается удалённым из иерархии макета.
Если макет должен быть повторно использован между приложениями, рекомендуется, чтобы макет удалял элемент, но графический фреймворк от этого не зависит.
Подкласс свободен в выборе способа хранения элементов.
void QGraphicsLayout::setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
Устанавливает отступы содержимого до значений left, top, right и bottom. По умолчанию отступы содержимого для верхнеуровневых макетов зависят от стиля (с помощью запроса пиксельной метрики для QStyle::PM_LayoutLeftMargin, QStyle::PM_LayoutTopMargin, QStyle::PM_LayoutRightMargin и QStyle::PM_LayoutBottomMargin).
Для подмакетов отступы по умолчанию равны 0.
Изменение отступов содержимого автоматически аннулирует макет.
См. также invalidate().
[override virtual] void QGraphicsLayout::updateGeometry()
Переопределяет: QGraphicsLayoutItem::updateGeometry().
[virtual] void QGraphicsLayout::widgetEvent(QEvent *e)
Этот виртуальный обработчик событий получает все события для управляемого виджета. QGraphicsLayout использует этот обработчик событий для прослушивания событий, связанных с макетом, таких как изменения геометрии, изменения макета или изменения направления макета.
e — указатель на событие.
Можно переопределить этот обработчик событий для отслеживания аналогичных событий для собственного пользовательского макета.
См. также QGraphicsWidget::event() и QGraphicsItem::sceneEvent().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qgraphicslayout.html