Класс QGraphicsProxyWidget
Класс QGraphicsProxyWidget предоставляет прокси-слой для встраивания QWidget в QGraphicsScene. Подробнее...
| Заголовок: | #include <QGraphicsProxyWidget> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследует: | QGraphicsWidget |
Типы публичного доступа
| Перечисление | безымянный { Type } |
Публичные функции
| 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 |
Переопределённые публичные функции
| virtual void | paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override |
| virtual void | setGeometry(const QRectF &rect) override |
| virtual int | type() const override |
Реализованные защищённые функции
| virtual void | contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override |
| virtual void | dragEnterEvent(QGraphicsSceneDragDropEvent *event) override |
| virtual void | dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override |
| virtual void | dragMoveEvent(QGraphicsSceneDragDropEvent *event) override |
| virtual void | dropEvent(QGraphicsSceneDragDropEvent *event) override |
| virtual bool | event(QEvent *event) override |
| virtual bool | eventFilter(QObject *object, QEvent *event) override |
| virtual void | focusInEvent(QFocusEvent *event) override |
| virtual bool | focusNextPrevChild(bool next) override |
| virtual void | focusOutEvent(QFocusEvent *event) override |
| virtual void | grabMouseEvent(QEvent *event) override |
| virtual void | hideEvent(QHideEvent *event) override |
| virtual void | hoverEnterEvent(QGraphicsSceneHoverEvent *event) override |
| virtual void | hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override |
| virtual void | hoverMoveEvent(QGraphicsSceneHoverEvent *event) override |
| virtual void | inputMethodEvent(QInputMethodEvent *event) override |
| virtual QVariant | inputMethodQuery(Qt::InputMethodQuery query) const override |
| virtual QVariant | itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override |
| virtual void | keyPressEvent(QKeyEvent *event) override |
| virtual void | keyReleaseEvent(QKeyEvent *event) override |
| virtual void | mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override |
| virtual void | mouseMoveEvent(QGraphicsSceneMouseEvent *event) override |
| virtual void | mousePressEvent(QGraphicsSceneMouseEvent *event) override |
| virtual void | mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override |
| virtual void | resizeEvent(QGraphicsSceneResizeEvent *event) override |
| virtual void | showEvent(QShowEvent *event) override |
| virtual QSizeF | sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override |
| virtual void | ungrabMouseEvent(QEvent *event) override |
| virtual 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() | Все функциональные возможности size hint встроенного виджета передаются прокси. |
| QWidget::getContentsMargins() | QGraphicsProxyWidget::getContentsMargins() | Обновляется один раз функцией setWidget(). |
| QWidget::windowTitle | QGraphicsProxyWidget::windowTitle | Обновляется один раз функцией setWidget(). |
Примечание: QGraphicsScene сохраняет встроенный виджет в специальном состоянии, которое предотвращает его вмешательство в работу других виджетов (встроенных и не встроенных) во время встраивания. В этом состоянии поведение виджета может незначительно отличаться от поведения, когда он не встраивается.
Предупреждение: Этот класс предоставлен для удобства при соединении QWidgets и QGraphicsItems, его не следует использовать в высокопроизводительных сценариях. В частности, встраивание виджетов в сцену, которая затем отображается с помощью QGraphicsView, использующего OpenGL-вьюпорт, не будет работать для всех комбинаций.
См. также QGraphicsScene::addWidget() и QGraphicsWidget.
Документация по типам членов
enum QGraphicsProxyWidget::anonymous
Значение, возвращаемое виртуальной функцией type().
| Константа | Значение | Описание |
|---|---|---|
QGraphicsProxyWidget::Type |
12 |
Виджет прокси графики |
Документация по функциям-членам
QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
Конструктор нового виджета QGraphicsProxy. 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 в этот прокси-виджет. Встраиваемый виджет должен находиться исключительно внутри или вне области просмотра графики. Вы не можете встроить виджет, пока он одновременно виден где-то еще в пользовательском интерфейсе.
widget должен быть виджетом верхнего уровня, родитель которого nullptr.
При встраивании состояние виджета (например, видимость, активность, геометрия, подсказки размера) копируется в прокси-виджет. Если встраиваемый виджет явно скрыт или отключен, прокси-виджет станет явно скрытым или отключенным после завершения встраивания. В документации класса представлен полный обзор общего состояния.
Флаги окна QGraphicsProxyWidget определяют, будут ли виджету после встраивания предоставлены декорации окна или нет.
После возвращения из этой функции 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.
[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.1/qgraphicsproxywidget.html