Класс QGraphicsLayout
Класс QGraphicsLayout предоставляет базовый класс для всех компоновок в Graphics View. Подробнее...
| Заголовок: | #include <QGraphicsLayout> |
| qmake: | QT += widgets |
| С тех пор: | Qt 4.4 |
| Наследует: | QGraphicsLayoutItem |
| Наследуется: | QGraphicsAnchorLayout, QGraphicsGridLayout и QGraphicsLinearLayout |
Этот класс был представлен в Qt 4.4.
Открытые функции
| 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, и аргумент QGraphicsLayoutItem's isLayout устанавливается в 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 уже находится в другом макете, он будет удален из этого макета.
Если пользовательские макеты требуют специального поведения, они могут проигнорировать использование этой функции и реализовать собственное поведение.
Функция была добавлена в Qt 4.6.
См. также 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. Отступы содержимого для макетов верхнего уровня зависят от стиля (путем запроса pixelMetric для 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-5.14/qgraphicslayout.html