Spec-Zone.ru › Qt

Класс 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

Переопределённые открытые функции

виртуальный 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() Функциональность всех подсказок размера из встраиваемого виджета передается прокси.
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 определяют, будут ли виджету после встраивания предоставлены украшения окна или нет.

После возвращения этой функции 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).

END_OF_DOCUMENT_MARKER

[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.2/qgraphicsproxywidget.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API