QGraphicsProxyWidget Class
QGraphicsProxyWidgetクラスは、QGraphicsScene にQWidget を埋め込むためのプロキシ・レイヤーを提供します。
ヘッダ | #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 ベースのウィジェット、例えば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つの方法があります。最も一般的な方法は、関連する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::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 をブリッジする際の便宜のために提供されています。特に、OpenGLビューポートを使用するQGraphicsView を介して表示されるシーンにウィジェットを埋め込むことは、すべての組み合わせで動作しません。
QGraphicsScene::addWidget() およびQGraphicsWidgetも参照してください 。
メンバ型ドキュメント
enum QGraphicsProxyWidget::anonymous
仮想type() 関数が返す値。
定数 | 値 | 説明 |
---|---|---|
QGraphicsProxyWidget::Type | 12 | グラフィックスプロキシウィジェット |
メンバ関数ドキュメント
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 のプロキシウィジェットを作成します。
この関数を使うと、トップレベルでないウィジェットのプロキシを取得することができます。例えば、ダイアログを埋め込んで、そのウィジェットの一つだけを変換することができます。
ウィジェットがすでに埋め込まれている場合は、既存のプロキシウィジェットを返します。
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()自身の矩形を返す。
埋め込まれたウィジェットがない場合、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()も参照してください 。
© 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.