Класс QGraphicsLayout
Класс QGraphicsLayout предоставляет базовый класс для всех макетов в представлении графики. Подробнее...
| Заголовок: | #include <QGraphicsLayout> |
| qmake: | QT += widgets |
| С тех пор: | Qt 4.4 |
| Наследует: | 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 |
- 35 открытых функций унаследованы от QGraphicsLayoutItem
Защищённые функции
| void | addChildLayoutItem(QGraphicsLayoutItem *layoutItem) |
- 3 защищённых функций унаследованы от QGraphicsLayoutItem
Подробное описание
Класс QGraphicsLayout предоставляет базовый класс для всех макетов в представлении графики.
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 уже находится в другом макете, он будет удален из этого макета.
Если пользовательские макеты требуют специального поведения, они могут пропустить эту функцию и реализовать своё поведение.
Эта функция была добавлена в 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().
[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.12/qgraphicslayout.html