QGraphicsProxyWidget Class Reference

[ QtGui module]

The QGraphicsProxyWidget class provides a proxy layer for embedding a QWidget QGraphicsScene . 更多...

继承 QGraphicsWidget .

方法


详细描述

The QGraphicsProxyWidget class provides a proxy layer for embedding a QWidget QGraphicsScene .

QGraphicsProxyWidget embeds QWidget -based widgets, for example, a QPushButton , QFontComboBox , or even QFileDialog , into QGraphicsScene . It forwards events between the two objects and translates between QWidget 's integer-based geometry and QGraphicsWidget 's qreal-based geometry. QGraphicsProxyWidget supports all core features of QWidget , including tab focus, keyboard input, Drag & Drop, and popups. You can also embed complex widgets, e.g., widgets with subwidgets.

范例:

 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 takes care of automatically embedding popup children of embedded widgets through creating a child proxy for each popup. This means that when an embedded QComboBox shows its popup list, a new QGraphicsProxyWidget is created automatically, embedding the popup, and positioning it correctly. This only works if the popup is child of the embedded widget (for example QToolButton.setMenu () requires the QMenu instance to be child of the QToolButton ).

采用 QGraphicsProxyWidget 嵌入 Widget

There are two ways to embed a widget using QGraphicsProxyWidget. The most common way is to pass a widget pointer to QGraphicsScene.addWidget () together with any relevant Qt.WindowFlags . This function returns a pointer to a QGraphicsProxyWidget. You can then choose to reparent or position either the proxy, or the embedded widget 本身。

For example, in the code snippet below, we embed a group box into the proxy:

 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();
			

The image below is the output obtained with its contents margin and contents rect labeled.

Alternatively, you can start by creating a new QGraphicsProxyWidget item, and then call setWidget () to embed a QWidget later. The widget () 函数返回 pointer to the embedded widget. QGraphicsProxyWidget shares ownership with QWidget , so if either of the two widgets are destroyed, the other widget will be automatically destroyed as well.

同步 Widget 状态

QGraphicsProxyWidget keeps its state in sync with the embedded widget. For example, if the proxy is hidden or disabled, the embedded widget will be hidden or disabled as well, and vice versa. When the widget is embedded by calling addWidget(), QGraphicsProxyWidget copies the state from the widget into the proxy, and after that, the two will stay synchronized where possible. By default, when you embed a widget into a proxy, both the widget and the proxy will be visible because a QGraphicsWidget is visible when created (you do not have to call show ()). If you explicitly hide the embedded widget, the proxy will also become invisible.

范例:

 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 maintains symmetry for the following states:

QWidget state QGraphicsProxyWidget state 注意事项
QWidget.enabled QGraphicsProxyWidget.enabled
QWidget.visible QGraphicsProxyWidget.visible The explicit state is also symmetric.
QWidget.geometry QGraphicsProxyWidget.geometry Geometry is only guaranteed to be symmetric while the embedded widget is visible.
QWidget.layoutDirection QGraphicsProxyWidget.layoutDirection
QWidget.style QGraphicsProxyWidget.style
QWidget.palette QGraphicsProxyWidget.palette
QWidget.font QGraphicsProxyWidget.font
QWidget.cursor QGraphicsProxyWidget.cursor The embedded widget overrides the proxy widget cursor. The proxy cursor changes depending on which embedded subwidget is currently under the mouse.
QWidget.sizeHint () QGraphicsProxyWidget.sizeHint () All size hint functionality from the embedded widget is forwarded by the proxy.
QWidget.getContentsMargins () QGraphicsProxyWidget.getContentsMargins () Updated once by setWidget ().
QWidget.windowTitle QGraphicsProxyWidget.windowTitle Updated once by setWidget ().

注意: QGraphicsScene keeps the embedded widget in a special state that prevents it from disturbing other widgets (both embedded and not embedded) while the widget is embedded. In this state, the widget may differ slightly in behavior from when it is not embedded.

警告: This class is provided for convenience when bridging QWidgets and QGraphicsItems, it should not be used for high-performance scenarios.


方法文档编制

QGraphicsProxyWidget.__init__ ( self , QGraphicsItem   parent  = None, Qt.WindowFlags   flags  = 0)

parent argument, if not None, causes self to be owned by Qt instead of PyQt.

Constructs a new QGraphicsProxy widget. parent and wFlags are passed to QGraphicsItem 的构造函数。

QGraphicsProxyWidget.contextMenuEvent ( self , QGraphicsSceneContextMenuEvent   event )

重实现自 QGraphicsItem.contextMenuEvent ().

QGraphicsProxyWidget QGraphicsProxyWidget.createProxyForChildWidget ( self , QWidget   child )

Creates a proxy widget for the given child of the widget contained in this proxy.

This function makes it possible to acquire proxies for non top-level widgets. For instance, you can embed a dialog, and then transform only one of its widgets.

If the widget is already embedded, return the existing proxy 小部件。

该函数在 Qt 4.5 引入。

另请参阅 newProxyWidget () 和 QGraphicsScene.addWidget ().

QGraphicsProxyWidget.dragEnterEvent ( self , QGraphicsSceneDragDropEvent   event )

重实现自 QGraphicsItem.dragEnterEvent ().

QGraphicsProxyWidget.dragLeaveEvent ( self , QGraphicsSceneDragDropEvent   event )

重实现自 QGraphicsItem.dragLeaveEvent ().

QGraphicsProxyWidget.dragMoveEvent ( self , QGraphicsSceneDragDropEvent   event )

重实现自 QGraphicsItem.dragMoveEvent ().

QGraphicsProxyWidget.dropEvent ( self , QGraphicsSceneDragDropEvent   event )

重实现自 QGraphicsItem.dropEvent ().

bool QGraphicsProxyWidget.event ( self , QEvent   event )

重实现自 QObject.event ().

bool QGraphicsProxyWidget.eventFilter ( self , QObject   object , QEvent   event )

重实现自 QObject.eventFilter ().

QGraphicsProxyWidget.focusInEvent ( self , QFocusEvent   event )

重实现自 QGraphicsItem.focusInEvent ().

bool QGraphicsProxyWidget.focusNextPrevChild ( self , bool  next )

重实现自 QGraphicsWidget.focusNextPrevChild ().

QGraphicsProxyWidget.focusOutEvent ( self , QFocusEvent   event )

重实现自 QGraphicsItem.focusOutEvent ().

QGraphicsProxyWidget.grabMouseEvent ( self , QEvent   event )

重实现自 QGraphicsWidget.grabMouseEvent ().

QGraphicsProxyWidget.hideEvent ( self , QHideEvent   event )

重实现自 QGraphicsWidget.hideEvent ().

QGraphicsProxyWidget.hoverEnterEvent ( self , QGraphicsSceneHoverEvent   event )

重实现自 QGraphicsItem.hoverEnterEvent ().

QGraphicsProxyWidget.hoverLeaveEvent ( self , QGraphicsSceneHoverEvent   event )

重实现自 QGraphicsItem.hoverLeaveEvent ().

QGraphicsProxyWidget.hoverMoveEvent ( self , QGraphicsSceneHoverEvent   event )

重实现自 QGraphicsItem.hoverMoveEvent ().

QVariant QGraphicsProxyWidget.itemChange ( self , QGraphicsItem.GraphicsItemChange   change , QVariant  value )

重实现自 QGraphicsItem.itemChange ().

QGraphicsProxyWidget.keyPressEvent ( self , QKeyEvent   event )

重实现自 QGraphicsItem.keyPressEvent ().

QGraphicsProxyWidget.keyReleaseEvent ( self , QKeyEvent   event )

重实现自 QGraphicsItem.keyReleaseEvent ().

QGraphicsProxyWidget.mouseDoubleClickEvent ( self , QGraphicsSceneMouseEvent   event )

重实现自 QGraphicsItem.mouseDoubleClickEvent ().

QGraphicsProxyWidget.mouseMoveEvent ( self , QGraphicsSceneMouseEvent   event )

重实现自 QGraphicsItem.mouseMoveEvent ().

QGraphicsProxyWidget.mousePressEvent ( self , QGraphicsSceneMouseEvent   event )

重实现自 QGraphicsItem.mousePressEvent ().

QGraphicsProxyWidget.mouseReleaseEvent ( self , QGraphicsSceneMouseEvent   event )

重实现自 QGraphicsItem.mouseReleaseEvent ().

QGraphicsProxyWidget QGraphicsProxyWidget.newProxyWidget ( self , QWidget )

Creates a proxy widget for the given child of the widget contained in this proxy.

您不应该直接调用此函数。使用 QGraphicsProxyWidget.createProxyForChildWidget () 代替。

This function is a fake virtual slot that you can reimplement in your subclass in order to control how new proxy widgets are created. The default implementation returns a proxy created with the QGraphicsProxyWidget () constructor with this proxy widget as the parent.

该函数在 Qt 4.5 引入。

另请参阅 createProxyForChildWidget ().

QGraphicsProxyWidget.paint ( self , QPainter   painter , QStyleOptionGraphicsItem   option , QWidget   widget )

重实现自 QGraphicsItem.paint ().

QGraphicsProxyWidget.resizeEvent ( self , QGraphicsSceneResizeEvent   event )

重实现自 QGraphicsWidget.resizeEvent ().

QGraphicsProxyWidget.setGeometry ( self , QRectF   rect )

重实现自 QGraphicsLayoutItem.setGeometry ().

QGraphicsProxyWidget.setWidget ( self , QWidget   widget )

widget argument has it's ownership transferred to Qt.

Embeds widget into this proxy widget. The embedded widget must reside exclusively either inside or outside of Graphics View. You cannot embed a widget as long as it is is visible elsewhere in the UI, at the same time.

widget must be a top-level widget whose parent is 0.

When the widget is embedded, its state (e.g., visible, enabled, geometry, size hints) is copied into the proxy widget. If the embedded widget is explicitly hidden or disabled, the proxy widget will become explicitly hidden or disabled after embedding is complete. The class documentation has a full overview over the shared state.

QGraphicsProxyWidget 's window flags determine whether the widget, after embedding, will be given window decorations or not.

After this function returns, QGraphicsProxyWidget will keep its state synchronized with that of widget whenever possible.

If a widget is already embedded by this proxy when this function is called, that widget will first be automatically unembedded. Passing 0 for the widget argument will only unembed the widget, and the ownership of the currently embedded widget will be passed on to the caller. Every child widget that are embedded will also be embedded and their proxy widget destroyed.

Note that widgets with the Qt.WA_PaintOnScreen widget attribute set and widgets that wrap an external application or controller cannot be embedded. Examples are QGLWidget and QAxWidget .

另请参阅 widget ().

QGraphicsProxyWidget.showEvent ( self , QShowEvent   event )

重实现自 QGraphicsWidget.showEvent ().

QSizeF QGraphicsProxyWidget.sizeHint ( self , Qt.SizeHint   which , QSizeF   constraint  = QSizeF())

重实现自 QGraphicsLayoutItem.sizeHint ().

QRectF QGraphicsProxyWidget.subWidgetRect ( self , QWidget   widget )

Returns the rectangle for widget , which must be a descendant of widget (),或 widget () itself, in this proxy item's local coordinates.

If no widget is embedded, widget is 0, or widget is not a descendant of the embedded widget, this function returns 空 QRectF .

另请参阅 widget ().

int QGraphicsProxyWidget.type ( self )

重实现自 QGraphicsItem.type ().

QGraphicsProxyWidget.ungrabMouseEvent ( self , QEvent   event )

重实现自 QGraphicsWidget.ungrabMouseEvent ().

QGraphicsProxyWidget.wheelEvent ( self , QGraphicsSceneWheelEvent   event )

重实现自 QGraphicsItem.wheelEvent ().

QWidget QGraphicsProxyWidget.widget ( self )

Returns a pointer to the embedded widget.

另请参阅 setWidget ().