Класс 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.13/qgraphicslayout.html