文章目录
QGraphicsProxyWidget 类
QGraphicsProxyWidget类提供了一个代理层,用于将QWidget嵌入QGraphicsScene中。
Header: | #include < QGraphicsProxyWidget> |
---|---|
qmake: | QT += widgets |
Inherits: | QGraphicsWidget |
Inherited By: | |
Since: | Qt 4.2 |
详述
QGraphicsProxyWidget将基于QWidget的小部件(例如QPushButton,QFontComboBox甚至QFileDialog)嵌入QGraphicsScene。 它在两个对象之间转发事件,并在QWidget的基于整数的几何和QGraphicsWidget的基于qreal的几何之间转换。 QGraphicsProxyWidget支持QWidget的所有核心功能,包括标签焦点,键盘输入,拖放和弹出窗口。 您还可以嵌入复杂的小部件,例如带有子小部件的小部件。
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QTabWidget *tabWidget = new QTabWidget;
tabWidget->addTab (new QLabel("hello 1"),"tab1");
tabWidget->addTab (new QLabel("hello 2"),"tab2");
tabWidget->addTab (new QLabel("hello 3"),"tab3");
tabWidget->tabBar ()->setDocumentMode (true);
tabWidget->tabBar ()->setDrawBase (true);
tabWidget->setTabShape (QTabWidget::Triangular);
QGraphicsScene scene(0,0,300,200);
QGraphicsProxyWidget *proxy = scene.addWidget(tabWidget);
proxy->moveBy (20,30);
QGraphicsView view(&scene);
view.show();
return app.exec();
}
QGraphicsProxyWidget通过为每个弹出窗口创建一个子代理来自动嵌入嵌入式小部件的弹出子窗口。这意味着当嵌入的QComboBox显示其弹出列表时,将自动创建一个新的QGraphicsProxyWidget,嵌入弹出框并正确定位它。这仅在弹出窗口是嵌入式小部件的子部件时有效(例如QToolButton::setMenu()要求QMenu实例是QToolButton的子部件)。
用QGraphicsProxyWidget嵌入小部件
有两种方法可以使用QGraphicsProxyWidget嵌入小部件。最常见的方法是将一个小部件指针传递到QGraphicsScene::addWidget()以及任何相关的Qt::WindowFlags。这个函数返回一个指向QGraphicsProxyWidget的指针。然后,您可以选择重新导入代理或定位嵌入的小部件本身。
例如,在下面的代码片段中,我们在代理中嵌入了一个分组框:
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项,然后调用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 false
QGraphicsProxyWidget为以下状态保持对称:
QWidget state | QGraphicsProxyWidget state | Notes |
---|---|---|
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 viewport的QGraphicsView显示,将不会对所有组合工作。
另请参阅QGraphicsScene::addWidget()和QGraphicsWidget。
公共类型
enum anonymous
由virtual type()函数返回的值。
Constant | Value | Description |
---|---|---|
QGraphicsTextItem::Type | 12 | 图形代理窗口小部件 |
公共函数
构造和析构
- QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
- virtual ~QGraphicsProxyWidget()
QWidget
- QWidget * widget() const
void setWidget(QWidget *widget) - QGraphicsProxyWidget * createProxyForChildWidget(QWidget *child)
- QRectF subWidgetRect(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)
演示代码
#include <QtWidgets>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
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);
proxy->setWindowFlags (Qt::Dialog);
QGraphicsView view(&scene);
view.show();
return app.exec();
}