一、描述
1、QGraphicsProxyWidget 类提供了一个代理层,用于在 QGraphicsScene 中嵌入 QWidget。
2、QGraphicsProxyWidget 在两个对象之间转发事件,并在 QWidget 的基于 int 的几何坐标和 QGraphicsWidget 的基于 qreal 的几何坐标之间进行转换。
3、QGraphicsProxyWidget 支持 QWidget 的所有核心功能,包括Tab切换焦点、键盘输入、拖放和弹出窗口等。
4、QGraphicsProxyWidget 通过为每个弹出窗口创建子代理来处理嵌入式小部件的弹出窗口子项。这意味着当嵌入的 QComboBox 显示其弹出列表时,会自动创建一个新的 QGraphicsProxyWidget,嵌入弹出窗口并正确定位。
1.1、使用 QGraphicsProxyWidget 嵌入小部件
有两种使用 QGraphicsProxyWidget 嵌入小部件的方法:
1、将小部件指针与任何相关的 Qt::WindowFlags 一起传递给 QGraphicsScene::addWidget()。此函数返回一个指向 QGraphicsProxyWidget 的指针。例:
QGroupBox *groupBox = new QGroupBox("group");
QLabel *numberLabel = new QLabel("lable");
QLineEdit *numberEdit = new QLineEdit;
QFormLayout *layout = new QFormLayout;
layout->addRow(numberLabel, numberEdit);
groupBox->setLayout(layout);
QGraphicsProxyWidget *proxy = gphs->addWidget(groupBox);
proxy->setPos(100,100);
2、创建一个 QGraphicsProxyWidget 项,然后调用 setWidget() 来嵌入QWidget。widget() 函数返回一个指向嵌入小部件的指针。QGraphicsProxyWidget 与 QWidget 共享所有权,因此两者中的任何一个被销毁,另一也将自动销毁。
QGroupBox *groupBox = new QGroupBox("group");
QLabel *numberLabel = new QLabel("lable");
QLineEdit *numberEdit = new QLineEdit;
QFormLayout *layout = new QFormLayout;
layout->addRow(numberLabel, numberEdit);
groupBox->setLayout(layout);
QGraphicsProxyWidget *proxy = new QGraphicsProxyWidget;
proxy->setWidget(groupBox);
gphs->addItem(proxy);
proxy->setPos(100,100);
1.2、同步小部件状态
QGraphicsProxyWidget 保持其状态与嵌入的小部件同步。例如,如果代理被隐藏或禁用,则嵌入的小部件也将被隐藏或禁用,反之亦然。
1.3、注意事项
1、场景将嵌入的小部件保持在特殊状态,以防止它在嵌入小部件时干扰其他小部件。在这种状态下,小部件的行为可能与未嵌入时的行为略有不同。
2、提供此类是为了 QWidgets 和 QGraphicsItems 桥接方便,不应将其用于高性能场景。
二、成员函数
1、QGraphicsProxyWidget *createProxyForChildWidget(QWidget *child)
为包含在当前代理中的小部件的给定子项创建代理小部件。此功能可以获取非顶级小部件的代理。
2、void setWidget(QWidget *widget)
将小部件嵌入到当前代理小部件中。小部件必须是父级为nullptr的顶级小部件。
当小部件被嵌入时,它的状态(例如,可见、启用、几何、大小提示)被复制到代理小部件中。
不能嵌入包装外部应用程序或控制器的小部件。例如 QGLWidget 和 QAxWidget。
3、QRectF subWidgetRect(const QWidget *w)
返回w的矩形,它必须是widget() 或widget() 本身的后代,在当前代理项的坐标中。如果没有嵌入小部件,或w为 nullptr,或者小部件不是嵌入小部件的后代,则返回一个空的 QRectF。
4、QWidget *widget()
返回指向嵌入小部件的指针。