QT的QGraphicsProxyWidget类的使用

详细说明
QGraphicsProxyWidget类提供了一个代理层,用于将QWidget嵌入QGraphicsScene中。

QGraphicsProxyWidget将基于QWidget的小部件(例如QPushButton,QFontComboBox甚至QFileDialog)嵌入QGraphicsScene。它在两个对象之间转发事件,并在QWidget的基于整数的几何和QGraphicsWidget的基于qreal的几何之间转换。 QGraphicsProxyWidget支持QWidget的所有核心功能,包括标签焦点,键盘输入,拖放和弹出窗口。您还可以嵌入复杂的小部件,例如带有子小部件的小部件。
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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嵌入窗口小部件有两种方法。最常见的方法是将小部件指针与任何相关的Qt :: WindowFlags一起传递给QGraphicsScene :: addWidget()。该函数返回一个指向QGraphicsProxyWidget的指针。然后,您可以选择重新定位或放置代理或嵌入式窗口小部件本身。
例如,在下面的代码片段中,我们将组框嵌入到代理中:

1
2
3
4
5
6
7
8
9
10
11
12
13
 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();

下图是获得的输出,其内容边距和内容rect被标记。
?在这里插入图片描述

另外,您可以先创建一个新的QGraphicsProxyWidget项,然后再调用setWidget()以稍后嵌入QWidget。 widget()函数返回一个指向嵌入式小部件的指针。 QGraphicsProxyWidget与QWidget拥有所有权,因此,如果两个小部件中的任何一个被销毁,另一个小部件也将被自动销毁。
同步小部件状态
QGraphicsProxyWidget使其状态与嵌入式窗口小部件保持同步。例如,如果隐藏或禁用了代理,则嵌入式小部件也将被隐藏或禁用,反之亦然。通过调用addWidget()嵌入窗口小部件时,QGraphicsProxyWidget将状态从窗口小部件复制到代理中,然后,在可能的情况下,两者将保持同步。默认情况下,将窗口小部件嵌入代理时,窗口小部件和代理都将可见,因为创建时会显示QGraphicsWidget(您不必调用show())。如果您明确隐藏嵌入式窗口小部件,则代理也将不可见。
例:

1
2
3
4
5
6
7
8
9
10
11
12
  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维护以下状态的对称性: