Класс QGraphicsProxyWidget
Класс QGraphicsProxyWidget предоставляет прокси-слой для встраивания QWidget в QGraphicsScene. Подробнее...
| Заголовок: | #include <QGraphicsProxyWidget> |
| qmake: | QT += widgets |
| С момента: | Qt 4.4 |
| Наследует: | QGraphicsWidget |
Этот класс был введён в Qt 4.4.
Типы публичного доступа
| Перечисление | безымянный { Тип } |
Функции публичного доступа
| 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, он не должен использоваться в высокопроизводительных сценариях.
См. также QGraphicsScene::addWidget() и QGraphicsWidget.
Документация по типам членов
перечисление 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's окно флагов определяет, будут ли у виджета, после встраивания, декорации окна или нет.
После возврата из этой функции QGraphicsProxyWidget будет поддерживать синхронизацию своего состояния с состоянием widget, по возможности.
Если виджет уже встроен этим прокси при вызове этой функции, этот виджет сначала будет автоматически извлечён. Передача 0 в качестве аргумента widget приведет только к извлечению виджета, и владение текущим встроенным виджетом будет передано вызывающей стороне. Каждый дочерний виджет, который встроен, также будет встроен, и его прокси-виджет будет уничтожен.
Обратите внимание, что виджеты с установленным атрибутом виджета Qt::WA_PaintOnScreen и виджеты, которые оборачивают внешнее приложение или контроллер, не могут быть встроенными. Примерами являются QGLWidget и 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.14/qgraphicsproxywidget.html