Класс QGraphicsProxyWidget
Класс QGraphicsProxyWidget предоставляет прокси-слой для встраивания QWidget в QGraphicsScene. Подробнее...
| Заголовок: | #include <QGraphicsProxyWidget> |
| qmake: | QT += widgets |
| С момента: | Qt 4.4 |
| Наследуется от: | QGraphicsWidget |
Этот класс был представлен в Qt 4.4.
Открытые типы
| Перечисление | безымянный { 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 |
Реализованные открытые функции
| виртуальный 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 поддерживает симметрию для следующих состояний:
Примечание: 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() с этим прокси-виджетом в качестве родителя.
Эта функция была добавлена в Qt 4.5.
См. также createProxyForChildWidget().
[virtual] QGraphicsProxyWidget::~QGraphicsProxyWidget()
Уничтожает прокси-виджет и любой встроенный виджет.
[override virtual protected] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
Переопределяет: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).
QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)
Создает прокси-виджет для данного child виджета, содержащегося в этом прокси.
Эта функция позволяет получить прокси для виджетов, не являющихся виджетами верхнего уровня. Например, вы можете встроить диалоговое окно и затем преобразовать только один из его виджетов.
Если виджет уже встроен, возвращает существующий прокси-виджет.
Эта функция была добавлена в Qt 4.5.
См. также 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 определяют, будут ли виджету после встраивания предоставлены декорации окна или нет.
После возвращения из этой функции 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-5.15/qgraphicsproxywidget.html