Класс QGraphicsProxyWidget
Класс QGraphicsProxyWidget предоставляет прокси-слой для встраивания QWidget в QGraphicsScene. Подробнее...
| Заголовок: | #include <QGraphicsProxyWidget> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследует: | QGraphicsWidget |
Открытые типы
| Перечисление | безымянный { Тип } |
Открытые функции
| QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags()) | |
| виртуальный | ~QGraphicsProxyWidget() |
| QGraphicsProxyWidget * | createProxyForChildWidget(QWidget *child) |
| void | setWidget(QWidget *widget) |
| QRectF | subWidgetRect(const QWidget *widget) const |
| QWidget * | widget() const |
Переопределенные открытые функции
| виртуальный void | paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override |
| виртуальный void | setGeometry(const QRectF &rect) override |
| виртуальный int | type() const override |
Реализованные защищённые функции
| виртуальный void | contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override |
| виртуальный void | dragEnterEvent(QGraphicsSceneDragDropEvent *event) override |
| виртуальный void | dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override |
| виртуальный void | dragMoveEvent(QGraphicsSceneDragDropEvent *event) override |
| виртуальный void | dropEvent(QGraphicsSceneDragDropEvent *event) override |
| виртуальный bool | event(QEvent *event) override |
| виртуальный bool | eventFilter(QObject *object, QEvent *event) override |
| виртуальный void | focusInEvent(QFocusEvent *event) override |
| виртуальный bool | focusNextPrevChild(bool next) override |
| виртуальный void | focusOutEvent(QFocusEvent *event) override |
| виртуальный void | grabMouseEvent(QEvent *event) override |
| виртуальный void | hideEvent(QHideEvent *event) override |
| виртуальный void | hoverEnterEvent(QGraphicsSceneHoverEvent *event) override |
| виртуальный void | hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override |
| виртуальный void | hoverMoveEvent(QGraphicsSceneHoverEvent *event) override |
| виртуальный void | inputMethodEvent(QInputMethodEvent *event) override |
| виртуальный QVariant | inputMethodQuery(Qt::InputMethodQuery query) const override |
| виртуальный QVariant | itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override |
| виртуальный void | keyPressEvent(QKeyEvent *event) override |
| виртуальный void | keyReleaseEvent(QKeyEvent *event) override |
| виртуальный void | mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override |
| виртуальный void | mouseMoveEvent(QGraphicsSceneMouseEvent *event) override |
| виртуальный void | mousePressEvent(QGraphicsSceneMouseEvent *event) override |
| виртуальный void | mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override |
| виртуальный void | resizeEvent(QGraphicsSceneResizeEvent *event) override |
| виртуальный void | showEvent(QShowEvent *event) override |
| виртуальный QSizeF | sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override |
| виртуальный void | ungrabMouseEvent(QEvent *event) override |
| виртуальный void | wheelEvent(QGraphicsSceneWheelEvent *event) override |
Защищённые слоты
| QGraphicsProxyWidget * | newProxyWidget(const QWidget *child) |
Подробное описание
QGraphicsProxyWidget встраивает виджеты на основе QWidget, например, QPushButton, QFontComboBox или даже QFileDialog, в QGraphicsScene. Он пересылает события между двумя объектами и выполняет преобразование между целочисленной геометрией QWidget и геометрией с плавающей точкой QGraphicsWidget. QGraphicsProxyWidget поддерживает все основные функции QWidget, включая табулированный фокус, ввод с клавиатуры, перетаскивание и всплывающие окна. Вы также можете встраивать сложные виджеты, например, виджеты с дочерними виджетами.
Пример:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTabWidget *tabWidget = new QTabWidget;
QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(tabWidget);
QGraphicsView view(&scene);
view.show();
return app.exec();
} QGraphicsProxyWidget отвечает за автоматическое вложение дочерних элементов всплывающих окон встраиваемых виджетов, создавая прокси-дочерний элемент для каждого всплывающего окна. Это означает, что при отображении списка всплывающего окна встраиваемого QComboBox, автоматически создается новый QGraphicsProxyWidget, который встраивает всплывающее окно и правильно его позиционирует. Это работает только в том случае, если всплывающее окно является дочерним элементом встраиваемого виджета (например, QToolButton::setMenu() требует, чтобы экземпляр QMenu был дочерним элементом QToolButton).
Встраивание виджета с помощью QGraphicsProxyWidget
Существует два способа встроить виджет с помощью QGraphicsProxyWidget. Наиболее распространенный способ — передать указатель на виджет в QGraphicsScene::addWidget() вместе с любыми соответствующими флагами Qt::WindowFlags. Эта функция возвращает указатель на QGraphicsProxyWidget. Затем вы можете переместить родителя или изменить положение либо прокси, либо самого встраиваемого виджета.
Например, в приведенном ниже фрагменте кода мы встраиваем групповую рамку в прокси:
QGroupBox *groupBox = new QGroupBox("Contact Details");
QLabel *numberLabel = new QLabel("Telephone number");
QLineEdit *numberEdit = new QLineEdit;
QFormLayout *layout = new QFormLayout;
layout->addRow(numberLabel, numberEdit);
groupBox->setLayout(layout);
QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(groupBox);
QGraphicsView view(&scene);
view.show(); На рисунке ниже показан результат с метками отступа и прямоугольника содержимого.
В качестве альтернативы, вы можете начать с создания нового элемента QGraphicsProxyWidget, а затем вызвать setWidget(), чтобы встроить QWidget позже. Функция widget() возвращает указатель на встраиваемый виджет. QGraphicsProxyWidget разделяет владение с QWidget, поэтому если любой из двух виджетов будет уничтожен, другой виджет будет автоматически уничтожен тоже.
Синхронизация состояний виджета
QGraphicsProxyWidget синхронизирует свое состояние с состоянием встраиваемого виджета. Например, если прокси скрыт или отключен, встраиваемый виджет также будет скрыт или отключен, и наоборот. Когда виджет встраивается, вызывая addWidget(), QGraphicsProxyWidget копирует состояние из виджета в прокси, а затем оба будут оставаться синхронизированными по возможности. По умолчанию, когда вы встраиваете виджет в прокси, и виджет, и прокси будут видимы, так как QGraphicsWidget является видимым при создании (вам не нужно вызывать show()). Если вы явно скрываете встраиваемый виджет, прокси также станет невидимым.
Пример:
QGraphicsScene scene; QLineEdit *edit = new QLineEdit; QGraphicsProxyWidget *proxy = scene.addWidget(edit); edit->isVisible(); // returns true proxy->isVisible(); // also returns true edit->hide(); edit->isVisible(); // returns false proxy->isVisible(); // also returns false
QGraphicsProxyWidget поддерживает симметрию для следующих состояний:
| QWidget состояние | QGraphicsProxyWidget состояние | Примечания |
|---|---|---|
| QWidget::enabled | QGraphicsProxyWidget::enabled | |
| QWidget::visible | QGraphicsProxyWidget::visible | Явное состояние также симметрично. |
| QWidget::geometry | QGraphicsProxyWidget::geometry | Геометрия гарантируется только симметричной, пока встраиваемый виджет видим. |
| QWidget::layoutDirection | QGraphicsProxyWidget::layoutDirection | |
| QWidget::style | QGraphicsProxyWidget::style | |
| QWidget::palette | QGraphicsProxyWidget::palette | |
| QWidget::font | QGraphicsProxyWidget::font | |
| QWidget::cursor | QGraphicsProxyWidget::cursor | Встраиваемый виджет переопределяет курсор виджета-прокси. Курсор прокси изменяется в зависимости от того, какой встраиваемый дочерний виджет находится в данный момент под курсором мыши. |
| QWidget::sizeHint() | QGraphicsProxyWidget::sizeHint() | Все функции sizeHint из встраиваемого виджета передаются прокси. |
| QWidget::getContentsMargins() | QGraphicsProxyWidget::getContentsMargins() | Обновляется один раз функцией setWidget(). |
| QWidget::windowTitle | QGraphicsProxyWidget::windowTitle | Обновляется один раз функцией setWidget(). |
Примечание: QGraphicsScene сохраняет встраиваемый виджет в специальном состоянии, которое предотвращает его вмешательство в другие виджеты (как встраиваемые, так и не встраиваемые), пока виджет встраивается. В этом состоянии поведение виджета может незначительно отличаться от поведения, когда он не встраивается.
Предупреждение: Этот класс предоставляется для удобства при связывании QWidgets и QGraphicsItems, его не следует использовать в высокопроизводительных сценариях. В частности, встраивание виджетов в сцену, которая затем отображается с помощью QGraphicsView, использующей OpenGL-вьюпорт, не будет работать для всех комбинаций.
См. также QGraphicsScene::addWidget() и QGraphicsWidget.
Документация по типам членов
перечисление QGraphicsProxyWidget::anonymous
Значение, возвращаемое виртуальной функцией type().
| Постоянная | Значение | Описание |
|---|---|---|
QGraphicsProxyWidget::Type |
12 |
Графический виджет-прокси |
Документация по функциям-членам
QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
Создает новый виджет-прокси. parent и wFlags передаются конструктору QGraphicsItem.
[protected slot] QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)
Создает прокси-виджет для заданного child виджета, являющегося дочерним по отношению к виджету, содержащемуся в этом прокси.
Не следует вызывать эту функцию напрямую; вместо этого используйте QGraphicsProxyWidget::createProxyForChildWidget().
Эта функция является фиктивным виртуальным слотом, который вы можете переопределить в своем подклассе для управления тем, как создаются новые прокси-виджеты. По умолчанию, она возвращает прокси, созданный с помощью конструктора QGraphicsProxyWidget() с этим виджетом-прокси в качестве родительского.
См. также createProxyForChildWidget().
[virtual] QGraphicsProxyWidget::~QGraphicsProxyWidget()
Уничтожает виджет-прокси и любой встроенный виджет.
[override virtual protected] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
Переопределяет: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).
QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)
Создает прокси-виджет для заданного child виджета, являющегося дочерним по отношению к виджету, содержащемуся в этом прокси.
Эта функция позволяет получить прокси для виджетов, не являющихся виджетами верхнего уровня. Например, вы можете встроить диалог, а затем преобразовать только один из его виджетов.
Если виджет уже встроен, возвращает существующий виджет-прокси.
См. также newProxyWidget() и QGraphicsScene::addWidget().
[override virtual protected] void QGraphicsProxyWidget::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
Переопределяет: QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
Переопределяет: QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
Переопределяет: QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dropEvent(QGraphicsSceneDragDropEvent *event)
Переопределяет: QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::event(QEvent *event)
Переопределяет: QGraphicsWidget::event(QEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)
Переопределяет: QObject::eventFilter(QObject *watched, QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::focusInEvent(QFocusEvent *event)
Переопределяет: QGraphicsWidget::focusInEvent(QFocusEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::focusNextPrevChild(bool next)
Переопределяет: QGraphicsWidget::focusNextPrevChild(bool next).
[override virtual protected] void QGraphicsProxyWidget::focusOutEvent(QFocusEvent *event)
Переопределяет: QGraphicsWidget::focusOutEvent(QFocusEvent *event).
[override virtual protected] void QGraphicsProxyWidget::grabMouseEvent(QEvent *event)
Переопределяет: QGraphicsWidget::grabMouseEvent(QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hideEvent(QHideEvent *event)
Переопределяет: QGraphicsWidget::hideEvent(QHideEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Переопределяет: QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Переопределяет: QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
Переопределяет: QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::inputMethodEvent(QInputMethodEvent *event)
Переопределяет: QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).
[override virtual protected] QVariant QGraphicsProxyWidget::inputMethodQuery(Qt::InputMethodQuery query) const
Переопределяет: QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const.
[override virtual protected] QVariant QGraphicsProxyWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
Переопределяет: QGraphicsWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value).
[override virtual protected] void QGraphicsProxyWidget::keyPressEvent(QKeyEvent *event)
Переопределяет: QGraphicsItem::keyPressEvent(QKeyEvent *event).
[override virtual protected] void QGraphicsProxyWidget::keyReleaseEvent(QKeyEvent *event)
Переопределяет: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
Переопределяет: QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Переопределяет: QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
Переопределяет: QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
Переопределяет: QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).
[override virtual] void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Переопределяет: QGraphicsWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget).
[override virtual protected] void QGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
Переопределяет: QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).
[override virtual] void QGraphicsProxyWidget::setGeometry(const QRectF &rect)
Переопределяет: QGraphicsLayoutItem::setGeometry(const QRectF &rect).
void QGraphicsProxyWidget::setWidget(QWidget *widget)
Встраивает widget в этот прокси-виджет. Встроенный виджет должен находиться исключительно внутри или вне области Graphics View. Вы не можете встроить виджет, пока он одновременно виден в другом месте пользовательского интерфейса.
widget должен быть виджетом верхнего уровня, родитель которого nullptr.
Когда виджет встроен, его состояние (например, видимость, активность, геометрия, подсказки размера) копируется в прокси-виджет. Если встроенный виджет явно скрыт или отключен, прокси-виджет станет явно скрытым или отключенным после завершения встраивания. В документации класса приведён полный обзор совместно используемого состояния.
QGraphicsProxyWidget's window flags определяют, будут ли виджету после встраивания предоставлены украшения окна или нет.
После возвращения этой функции QGraphicsProxyWidget будет поддерживать синхронизацию своего состояния со состоянием widget, когда это возможно.
Если виджет уже встроен этим прокси при вызове этой функции, этот виджет будет автоматически извлечён. Передача nullptr в аргументе widget будет только извлекать виджет, а владение текущим встроенным виджетом будет передано вызывающей стороне. Каждый дочерний виджет, который встроен, также будет встроен, и его прокси-виджет будет уничтожен.
Обратите внимание, что виджеты с установленным атрибутом виджета Qt::WA_PaintOnScreen и виджеты, которые оборачивают внешнее приложение или контроллер, не могут быть встроены. Примеры — QOpenGLWidget и QAxWidget.
См. также widget().
[override virtual protected] void QGraphicsProxyWidget::showEvent(QShowEvent *event)
Переопределяет: QGraphicsWidget::showEvent(QShowEvent *event).
[override virtual protected] QSizeF QGraphicsProxyWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const
Переопределяет: QGraphicsWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const.
QRectF QGraphicsProxyWidget::subWidgetRect(const QWidget *widget) const
Возвращает прямоугольник для widget, который должен быть потомком widget() или самим widget() в локальных координатах этого элемента-прокси.
Если виджет не встроен, widget равен nullptr, или widget не является потомком встроенного виджета, эта функция возвращает пустой QRectF.
См. также widget().
[override virtual] int QGraphicsProxyWidget::type() const
Переопределяет: QGraphicsWidget::type() const.
END_OF_DOCUMENT_MARKER
[override virtual protected] void QGraphicsProxyWidget::ungrabMouseEvent(QEvent *event)
Переопределяет: QGraphicsWidget::ungrabMouseEvent(QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::wheelEvent(QGraphicsSceneWheelEvent *event)
Переопределяет: QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).
QWidget *QGraphicsProxyWidget::widget() const
Возвращает указатель на встроенный виджет.
См. также setWidget().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qgraphicsproxywidget.html