Класс QGraphicsLayout
Класс QGraphicsLayout предоставляет базовый класс для всех макетов в Graphics View. Подробнее...
| Заголовок: | #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. По умолчанию отступы содержимого для макетов верхнего уровня зависят от стиля (запрашивая 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-6.2/qgraphicslayout.html