QGraphicsProxyWidget Class
QGraphicsProxyWidget クラスは、QWidget をQGraphicsScene に埋め込むためのプロキシ層を提供します。詳細...
| ヘッダー: | #include <QGraphicsProxyWidget> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 継承元: | QGraphicsWidget |
パブリック型
| enum { 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 ベースのウィジェット(例えば、QPushButton 、QFontComboBox 、あるいはQFileDialog など)をQGraphicsScene に埋め込みます。このウィジェットは、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 つの方法があります。最も一般的な方法は、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(groupBox);
layout->addRow(numberLabel, numberEdit);
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 falseQGraphicsProxyWidgetは、以下の状態において対称性を維持します:
| 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() によって 1 回更新されます。 |
| QWidget::windowTitle | QGraphicsProxyWidget::windowTitle | setWidget() によって 1 回更新されます。注: は、ウィジェットが埋め込まれている間、他のウィジェット(埋め込まれているもの、埋め込まれていないものを問わず)に干渉しないよう、埋め込みウィジェットを |
注: QGraphicsScene は 、ウィジェットが埋め込まれている間、他のウィジェット(埋め込まれているもの、埋め込まれていないものとも)に悪影響を与えないよう、埋め込まれたウィジェットを特別な状態に保ちます。この状態では、ウィジェットの挙動が、埋め込まれていない場合とわずかに異なる場合があります。
警告:このクラスは 、QWidget と QGraphicsItem を橋渡しする際の便宜のために提供されているものであり、高性能が求められるシナリオでは使用すべきではありません。特に、OpenGL ビューポートを使用するQGraphicsView を通じて表示されるシーンにウィジェットを埋め込む場合、すべての組み合わせで正常に動作するとは限りません。
関連項目: QGraphicsScene::addWidget() およびQGraphicsWidget 。
メンバ関数のドキュメント
QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
新しい QGraphicsProxy ウィジェットを作成します。parent およびwFlags は、QGraphicsItem のコンストラクタに渡されます。
[virtual noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()
プロキシウィジェットおよび埋め込まれたすべてのウィジェットを破棄します。
[override virtual protected] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) を再実装します。
QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)
このプロキシに含まれるウィジェットの指定されたchild に対して、プロキシウィジェットを作成します。
この関数を使用することで、トップレベルではないウィジェットのプロキシを取得することが可能になります。たとえば、ダイアログを埋め込み、その中のウィジェットのうち1つだけを変換することができます。
ウィジェットがすでに埋め込まれている場合は、既存のプロキシウィジェットを返します。
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 を渡すと、ウィジェットの埋め込みが解除されるだけであり、現在埋め込まれているウィジェットの所有権は呼び出し元に引き継がれます。埋め込まれているすべての子ウィジェットも同様に埋め込みが解除され、それらのプロキシウィジェットは破棄されます。
なお、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()も参照してください 。
© 2026 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.