QGraphicsProxyWidget Class
Die Klasse QGraphicsProxyWidget bietet eine Proxy-Schicht für die Einbettung von QWidget in eine QGraphicsScene. Mehr...
Kopfzeile: | #include <QGraphicsProxyWidget> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
Vererbt: | QGraphicsWidget |
Öffentliche Typen
enum | anonymous { Type } |
Öffentliche Funktionen
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 |
Reimplementierte öffentliche Funktionen
virtual void | paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override |
virtual void | setGeometry(const QRectF &rect) override |
virtual int | type() const override |
Reimplementierte geschützte Funktionen
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 |
Geschützte Steckplätze
QGraphicsProxyWidget * | newProxyWidget(const QWidget *child) |
Detaillierte Beschreibung
QGraphicsProxyWidget bettet QWidget-basierte Widgets, z.B. ein QPushButton, QFontComboBox oder auch QFileDialog, in QGraphicsScene ein. Es leitet Ereignisse zwischen den beiden Objekten weiter und übersetzt zwischen der Integer-basierten Geometrie von QWidget und der QReal-basierten Geometrie von QGraphicsWidget. QGraphicsProxyWidget unterstützt alle Kernfunktionen von QWidget, einschließlich Tabulator-Fokus, Tastatureingabe, Drag & Drop und Popups. Sie können auch komplexe Widgets einbetten, z.B. Widgets mit Subwidgets.
Beispiel:
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 kümmert sich um die automatische Einbettung von Popup-Kindern eingebetteter Widgets, indem es einen Kind-Proxy für jedes Popup erstellt. Das bedeutet, dass, wenn ein eingebettetes QComboBox seine Popup-Liste anzeigt, automatisch ein neues QGraphicsProxyWidget erstellt wird, das das Popup einbettet und es korrekt positioniert. Dies funktioniert nur, wenn das Popup ein Kind des eingebetteten Widgets ist (zum Beispiel erfordert QToolButton::setMenu(), dass die QMenu Instanz ein Kind des QToolButton ist).
Einbetten eines Widgets mit QGraphicsProxyWidget
Es gibt zwei Möglichkeiten, ein Widget mit QGraphicsProxyWidget einzubetten. Der gebräuchlichste Weg ist die Übergabe eines Widget-Zeigers an QGraphicsScene::addWidget() zusammen mit allen relevanten Qt::WindowFlags. Diese Funktion gibt einen Zeiger auf ein QGraphicsProxyWidget zurück. Sie können dann wählen, ob Sie entweder den Proxy oder das eingebettete Widget selbst reparieren oder positionieren möchten.
Im folgenden Codeschnipsel wird zum Beispiel ein Gruppenrahmen in den Proxy eingebettet:
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();
Das folgende Bild zeigt die Ausgabe, die mit dem Rand und dem Rechteck des Inhalts beschriftet ist.
Alternativ können Sie auch zunächst ein neues QGraphicsProxyWidget-Element erstellen und dann setWidget() aufrufen, um später ein QWidget einzubetten. Die Funktion widget() gibt einen Zeiger auf das eingebettete Widget zurück. QGraphicsProxyWidget teilt sich den Besitz mit QWidget. Wenn also eines der beiden Widgets zerstört wird, wird auch das andere Widget automatisch zerstört.
Synchronisieren von Widget-Zuständen
QGraphicsProxyWidget hält seinen Status mit dem des eingebetteten Widgets synchronisiert. Wenn z.B. der Proxy versteckt oder deaktiviert ist, wird das eingebettete Widget ebenfalls versteckt oder deaktiviert und vice versa. Wenn das Widget durch den Aufruf von addWidget() eingebettet wird, kopiert QGraphicsProxyWidget den Status des Widgets in den Proxy, und danach bleiben die beiden, soweit möglich, synchronisiert. Wenn Sie ein Widget in einen Proxy einbetten, sind standardmäßig sowohl das Widget als auch der Proxy sichtbar, da ein QGraphicsWidget bei der Erstellung sichtbar ist (Sie müssen nicht show() aufrufen). Wenn Sie das eingebettete Widget explizit ausblenden, wird auch der Proxy unsichtbar.
Beispiel:
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 behält die Symmetrie für die folgenden Zustände bei:
QWidget Zustand | QGraphicsProxyWidget Zustand | Anmerkungen |
---|---|---|
QWidget::enabled | QGraphicsProxyWidget::aktiviert | |
QWidget::visible | QGraphicsProxyWidget::sichtbar | Der explizite Zustand ist ebenfalls symmetrisch. |
QWidget::geometry | QGraphicsProxyWidget::Geometrie | Die Geometrie ist nur dann garantiert symmetrisch, wenn das eingebettete Widget sichtbar ist. |
QWidget::layoutDirection | QGraphicsProxyWidget::layoutDirection | |
QWidget::style | QGraphicsProxyWidget::Stil | |
QWidget::palette | QGraphicsProxyWidget::palette | |
QWidget::font | QGraphicsProxyWidget::Schriftart | |
QWidget::cursor | QGraphicsProxyWidget::Mauszeiger | Das eingebettete Widget hat Vorrang vor dem Proxy-Widget-Cursor. Der Proxy-Cursor ändert sich je nachdem, welches eingebettete Subwidget sich gerade unter der Maus befindet. |
QWidget::sizeHint() | QGraphicsProxyWidget::sizeHint() | Die gesamte Funktionalität des Größenhinweises des eingebetteten Widgets wird durch den Proxy weitergeleitet. |
QWidget::getContentsMargins() | QGraphicsProxyWidget::getContentsMargins() | Wird einmal durch setWidget() aktualisiert. |
QWidget::windowTitle | QGraphicsProxyWidget::windowTitle | Einmalig aktualisiert durch setWidget(). |
Hinweis: QGraphicsScene hält das eingebettete Widget in einem speziellen Zustand, der verhindert, dass es andere Widgets (sowohl eingebettete als auch nicht eingebettete) stört, während das Widget eingebettet ist. In diesem Zustand kann sich das Widget etwas anders verhalten als wenn es nicht eingebettet ist.
Warnung: Diese Klasse dient der Bequemlichkeit beim Überbrücken von QWidgets und QGraphicsItems, sie sollte nicht für Hochleistungsszenarien verwendet werden. Insbesondere das Einbetten von Widgets in eine Szene, die dann über eine QGraphicsView angezeigt wird, die ein OpenGL-Viewport verwendet, wird nicht für alle Kombinationen funktionieren.
Siehe auch QGraphicsScene::addWidget() und QGraphicsWidget.
Dokumentation der Mitgliedstypen
enum QGraphicsProxyWidget::anonymous
Der Wert, der von der virtuellen Funktion type() zurückgegeben wird.
Konstante | Wert | Beschreibung |
---|---|---|
QGraphicsProxyWidget::Type | 12 | Ein Grafik-Proxy-Widget |
Dokumentation der Mitgliedsfunktionen
QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
Konstruiert ein neues QGraphicsProxy-Widget. parent und wFlags werden an den Konstruktor von QGraphicsItem übergeben.
[virtual noexcept]
QGraphicsProxyWidget::~QGraphicsProxyWidget()
Zerstört das Proxy-Widget und alle eingebetteten Widgets.
[override virtual protected]
void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
Reimplements: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).
QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)
Erzeugt ein Proxy-Widget für die angegebene child des in diesem Proxy enthaltenen Widgets.
Mit dieser Funktion ist es möglich, Proxys für Widgets zu erstellen, die nicht der obersten Ebene angehören. Sie können zum Beispiel einen Dialog einbetten und dann nur eines seiner Widgets umwandeln.
Wenn das Widget bereits eingebettet ist, wird das vorhandene Proxy-Widget zurückgegeben.
Siehe auch newProxyWidget() und QGraphicsScene::addWidget().
[override virtual protected]
void QGraphicsProxyWidget::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
Reimplements: QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
Reimplements: QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
Reimplements: QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::dropEvent(QGraphicsSceneDragDropEvent *event)
Reimplements: QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected]
bool QGraphicsProxyWidget::event(QEvent *event)
Reimplements: QGraphicsWidget::event(QEvent *Event).
[override virtual protected]
bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)
Reimplements: QObject::eventFilter(QObject *watched, QEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::focusInEvent(QFocusEvent *event)
Reimplements: QGraphicsWidget::focusInEvent(QFocusEvent *event).
[override virtual protected]
bool QGraphicsProxyWidget::focusNextPrevChild(bool next)
Reimplements: QGraphicsWidget::focusNextPrevChild(bool next).
[override virtual protected]
void QGraphicsProxyWidget::focusOutEvent(QFocusEvent *event)
Reimplements: QGraphicsWidget::focusOutEvent(QFocusEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::grabMouseEvent(QEvent *event)
Reimplements: QGraphicsWidget::grabMouseEvent(QEvent *Event).
[override virtual protected]
void QGraphicsProxyWidget::hideEvent(QHideEvent *event)
Reimplements: QGraphicsWidget::hideEvent(QHideEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Reimplements: QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Reimplements: QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
Reimplements: QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::inputMethodEvent(QInputMethodEvent *event)
Reimplements: QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).
[override virtual protected]
QVariant QGraphicsProxyWidget::inputMethodQuery(Qt::InputMethodQuery query) const
Reimplements: QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const.
[override virtual protected]
QVariant QGraphicsProxyWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
Reimplements: QGraphicsWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value).
[override virtual protected]
void QGraphicsProxyWidget::keyPressEvent(QKeyEvent *event)
Reimplements: QGraphicsItem::keyPressEvent(QKeyEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::keyReleaseEvent(QKeyEvent *event)
Reimplements: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
Reimplements: QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Reimplements: QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
Reimplements: QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected]
void QGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
Reimplements: QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).
[protected slot]
QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)
Erzeugt ein Proxy-Widget für die angegebene child des in diesem Proxy enthaltenen Widgets.
Sie sollten diese Funktion nicht direkt aufrufen; verwenden Sie stattdessen QGraphicsProxyWidget::createProxyForChildWidget().
Diese Funktion ist ein gefälschter virtueller Slot, den Sie in Ihrer Unterklasse reimplementieren können, um zu kontrollieren, wie neue Proxy-Widgets erstellt werden. Die Standardimplementierung gibt einen Proxy zurück, der mit dem QGraphicsProxyWidget()-Konstruktor mit diesem Proxy-Widget als Elternteil erstellt wurde.
Siehe auch createProxyForChildWidget().
[override virtual]
void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Reimplements: QGraphicsWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget).
[override virtual protected]
void QGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
Reimplements: QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).
[override virtual]
void QGraphicsProxyWidget::setGeometry(const QRectF &rect)
Reimplements: QGraphicsLayoutItem::setGeometry(const QRectF &rect).
void QGraphicsProxyWidget::setWidget(QWidget *widget)
Bettet widget in dieses Proxy-Widget ein. Das eingebettete Widget muss sich ausschließlich entweder innerhalb oder außerhalb der Grafikansicht befinden. Sie können ein Widget nicht einbetten, solange es gleichzeitig an anderer Stelle in der Benutzeroberfläche sichtbar ist.
widget muss ein Top-Level-Widget sein, dessen Elternteil nullptr
ist.
Wenn das Widget eingebettet wird, wird sein Zustand (z. B. sichtbar, aktiviert, Geometrie, Größenhinweise) in das Proxy-Widget kopiert. Wenn das eingebettete Widget explizit ausgeblendet oder deaktiviert ist, wird das Proxy-Widget nach Abschluss der Einbettung explizit ausgeblendet oder deaktiviert. Die Klassendokumentation bietet einen vollständigen Überblick über den gemeinsamen Status.
QGraphicsProxyWidgetDie Fenster-Flags bestimmen, ob das Widget nach der Einbettung mit Fensterdekorationen versehen wird oder nicht.
Nachdem diese Funktion zurückgekehrt ist, hält QGraphicsProxyWidget seinen Zustand mit dem von widget synchronisiert, wann immer dies möglich ist.
Wenn ein Widget bereits von diesem Proxy eingebettet ist, wenn diese Funktion aufgerufen wird, wird dieses Widget zunächst automatisch entbettet. Die Übergabe von nullptr
für das Argument widget hebt nur die Einbettung des Widgets auf, und der Besitz des aktuell eingebetteten Widgets wird an den Aufrufer weitergegeben. Alle Kind-Widgets, die eingebettet sind, werden ebenfalls eingebettet und ihr Proxy-Widget zerstört.
Beachten Sie, dass Widgets mit dem Qt::WA_PaintOnScreen Widget-Attribut und Widgets, die eine externe Anwendung oder einen Controller umhüllen, nicht eingebettet werden können. Beispiele sind QOpenGLWidget und QAxWidget.
Siehe auch widget().
[override virtual protected]
void QGraphicsProxyWidget::showEvent(QShowEvent *event)
Reimplements: QGraphicsWidget::showEvent(QShowEvent *event).
[override virtual protected]
QSizeF QGraphicsProxyWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const
Reimplements: QGraphicsWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const.
QRectF QGraphicsProxyWidget::subWidgetRect(const QWidget *widget) const
Gibt das Rechteck für widget zurück, das ein Nachkomme von widget() oder widget() selbst sein muss, in den lokalen Koordinaten dieses Proxy-Elements.
Wenn kein Widget eingebettet ist, widget nullptr
ist oder widget kein Nachkomme des eingebetteten Widgets ist, gibt diese Funktion ein leeres QRectF zurück.
Siehe auch widget().
[override virtual]
int QGraphicsProxyWidget::type() const
Reimplements: QGraphicsWidget::type() const.
[override virtual protected]
void QGraphicsProxyWidget::ungrabMouseEvent(QEvent *event)
Reimplements: QGraphicsWidget::ungrabMouseEvent(QEvent *Event).
[override virtual protected]
void QGraphicsProxyWidget::wheelEvent(QGraphicsSceneWheelEvent *event)
Reimplements: QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).
QWidget *QGraphicsProxyWidget::widget() const
Gibt einen Zeiger auf das eingebettete Widget zurück.
Siehe auch 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.