QGraphicsProxyWidget Class

QGraphicsProxyWidgetクラスは、QGraphicsSceneQWidget を埋め込むためのプロキシ・レイヤーを提供します

ヘッダ #include <QGraphicsProxyWidget>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
継承: QGraphicsWidget

パブリックな型

enum anonymous { Type }

パブリック関数

QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
virtual ~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 ベースのウィジェット、例えばQPushButtonQFontComboBox 、あるいはQFileDialogQGraphicsScene に埋め込みます。これは、2 つのオブジェクト間でイベントを転送し、QWidget の整数ベースのジオメトリとQGraphicsWidget の qreal ベースのジオメトリの間で変換します。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を使ってウィジェットを埋め込むには、2つの方法があります。最も一般的な方法は、関連するQt::WindowFlags とともにQGraphicsScene::addWidget() にウィジェット・ポインタを渡す方法です。この関数はQGraphicsProxyWidgetへのポインタを返します。その後、プロキシ、または埋め込まれたウィジェット自体を再ペアレントするか、配置するかを選択できます。

例えば、以下のコードでは、グループボックスをプロキシに埋め込んでいます:

QGroupBox *groupBox = new QGroupBox("Contact Details");
QLabel *numberLabel = new QLabel("Telephone number");
QLineEdit *numberEdit = new QLineEdit;

QFormLayout *layout = new QFormLayout(groupBox);
layout->addRow(numberLabel, numberEdit);

QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(groupBox);

QGraphicsView view(&scene);
view.show();

下の画像は、コンテンツマージンとコンテンツ矩形がラベル付けされた出力です。

あるいは、新しいQGraphicsProxyWidgetアイテムを作成することから始め、setWidget ()を呼び出して、QWidget を後で埋め込むこともできます。widget() 関数は、埋め込まれたウィジェットへのポインタを返します。QGraphicsProxyWidget は、QWidget と所有権を共有しているため、2 つのウィジェットのどちらかが破棄されると、もう一方のウィジェットも自動的に破棄されます。

ウィジェットの状態の同期

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::enabledQGraphicsProxyWidget::enabled
QWidget::visibleQGraphicsProxyWidget::visible明示的な状態も対称です。
QWidget::geometryQGraphicsProxyWidget::geometryジオメトリは、埋め込みウィジェットが表示されている間のみ対称であることが保証されます。
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::style
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::font
QWidget::cursorQGraphicsProxyWidget::cursor埋め込みウィジェットはプロキシウィジェットのカーソルを上書きします。プロキシカーソルは、どの埋め込みサブウィジェットが現在マウスの下にあるかによって変化します。
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()埋め込みウィジェットからのすべてのサイズヒント機能は、プロキシによって転送されます。
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()setWidget() によって一度更新されます。
QWidget::windowTitleQGraphicsProxyWidget::windowTitlesetWidget() によって一度更新されました。

注意: QGraphicsScene は、ウィジェットが埋め込まれている間、他のウィジェット (埋め込まれているウィジェットも埋め込まれていないウィジェットも) の邪魔にならないように、埋め込まれたウィジェットを特別な状態に保ちます。この状態では、ウィジェットは埋め込まれていないときと動作が少し異なるかもしれません。

警告 このクラスは、QWidgets と QGraphicsItems をブリッジする際の便宜のために提供されています。特に、OpenGLビューポートを使用するQGraphicsView を介して表示されるシーンにウィジェットを埋め込むことは、すべての組み合わせで動作しません。

QGraphicsScene::addWidget() およびQGraphicsWidgetも参照してください

メンバ型ドキュメント

enum QGraphicsProxyWidget::anonymous

仮想type() 関数が返す値。

定数説明
QGraphicsProxyWidget::Type12グラフィックスプロキシウィジェット

メンバ関数ドキュメント

QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())

新しい QGraphicsProxy ウィジェットを構築します。parentwFlagsQGraphicsItem のコンストラクタに渡されます。

[virtual noexcept] 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)。

[protected slot] QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)

このプロキシに含まれるウィジェットの指定されたchild のプロキシウィジェットを作成します。

この関数を直接呼び出すべきではありません。代わりにQGraphicsProxyWidget::createProxyForChildWidget() を使用してください。

この関数は、新しいプロキシウィジェットの作成方法を制御するために、サブクラスで再実装できる偽の仮想スロットです。デフォルトの実装では、このプロキシウィジェットを親としてQGraphicsProxyWidget() コンストラクタで作成されたプロキシを返します。

createProxyForChildWidget()も参照してください

[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 の内部または外部にのみ存在する必要があります。UI の他の場所に同時に表示されているウィジェットを埋め込むことはできません。

widget は、親が であるトップレベルのウィジェットでなければなりません。nullptr

ウィジェットが埋め込まれると、その状態(可視、有効、ジオメトリ、サイズヒントなど)がプロキシウィジェットにコピーされます。埋め込まれたウィジェットが明示的に非表示または無効にされている場合、埋め込みが完了すると、プロキシウィジェットは明示的に非表示または無効になります。クラスのドキュメントに、共有状態の完全な概要があります。

QGraphicsProxyWidgetウィンドウフラグは、埋め込み後のウィジェットにウィンドウ装飾を与えるかどうかを決定します。

この関数が戻った後、QGraphicsProxyWidget は、可能な限りwidget と同期した状態を維持します。

この関数が呼ばれたときに、すでにこのプロキシによってウィジェットが埋め込まれていた場合、そのウィジェットは最初に自動的に埋め込まれなくなります。widget の引数にnullptr を渡すと、そのウィジェットの埋め込みが解除されるだけで、現在埋め込まれているウィジェットの所有権は呼び出し元に渡されます。埋め込まれたすべての子ウィジェットも埋め込まれ、そのプロキシウィジェットは破棄されます。

Qt::WA_PaintOnScreen widget属性が設定されているウィジェットや、外部アプリケーションやコントローラをラップしているウィジェットは、埋め込むことができないことに注意してください。例としては、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()自身の矩形を返す。

埋め込まれたウィジェットがない場合、widgetnullptr である場合、または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()も参照してください

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.