如何在布局和小部件中使用QGraphicsScene

10

我正在Qt4中创建一些图形数据显示小部件,我想使用QGraphicsScene创建QGraphicsItem来呈现数据项。

然而,我想在小部件中添加一些控件(例如滚动条、缩放和其他按钮-我希望以类似于Google地图的方式,将数据显示在小部件之上,并显示在它们之上)。因此,我认为将它们添加到场景中可能是可行的(可能作为一个QGraphicsGroupItem的子项,该项将显示在数据之上)。但是,当我调整整个小部件的大小时,我希望它们也能移动和调整大小,因此我应该使用QGraphicsLayout进行管理。但是这时我发现事情变得非常复杂。

问题在于,使用QGraphicsLayout时有以下约束:

  1. 只有QGraphicsWidget可以由布局管理
  2. QGraphicsLayout只能用于管理QGraphicsWidget的子项

这意味着我必须将我的控件创建为QGraphicsWidget,将一个顶层QGraphicsWidget添加到数据小部件中,并自己管理这个顶层小部件的大小。

因此,我想问:

  1. 使用经典方法(即为所有控件使用普通的小部件,并仅使用QGraphicsScene来显示数据)不是更合理吗?

  2. 在这种情况下,使用QGraphicsScene是否有任何优势(如性能或简单性...)?

  3. 如何使用QGraphicsScene来利用它的优点?

2个回答

7
自Qt 4.4以来,您可以使用QGraphicsProxyWidgetQGraphicsScene中嵌入经典小部件:
QWidget *widget = new QWidget;
QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(widget);

1
如果您认为QGraphicsScene(或其他适合您大部分显示的小部件)是合适的,请使用它。我们过去做过类似的事情,即创建一个从QWidget继承(以某种方式)的自定义小部件,并将控件小部件放置在该小部件的布局上方。这意味着整个小部件正在绘制您想要绘制的任何内容,并且控件小部件位于其上方,在整个小部件调整大小时进行调整。
另外,有几次我们遇到了布局有点太复杂,难以轻松处理的情况。与其创建自定义布局,我们只需在没有布局的情况下定位它们,并在调整大小事件中通过代码移动它们。这同样有效。

QGraphicsScene最大的问题在于它实际上并不是一个widget。它更像是一个项目集合(如矩形、椭圆等),可以自动绘制、缩放等。你描述的是经典的老式widget方式,我可能会坚持使用它。我想使用“时髦和新颖”的功能,但经过第二次考虑,除非有人证明我错了,否则它看起来并不那么闪亮。 - jpalecek
jpalecek:查看“时钟”小部件演示@http://www.qtsoftware.com/developer/pimp-my-widgets-developer-contest .. 没有在时钟小部件上花太多心思,但是它的实现是使用QGraphics(Scene | Widget | View | Item)完成的。 - rasjani
@jpalecek:我认为QGraphicsScene不是一个小部件,这就是为什么我说要“以某种方式”继承。但是你有一个QGraphicsView(或类似的东西),对吗?除非你想让它们随着场景变换,否则你可能想把你的小部件放在上面。我认为在这种情况下,普通的小部件方式更简单、更直接。 - Caleb Huitt - cjhuitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接