QGraphicsWidget与QGraphicsLayoutItem

时间:2010-11-07 05:51:51

标签: qt pyqt

我第一次使用QGraphicsView / Scene。这是在PyQt中,但除了Python与多重继承不同之外,我认为这是一个通用的Qt问题。

我首先创建了几个QGraphicsItem重载作为构建块。一旦我按照我想要的方式工作,我想尝试将它们结合起来,并且发现我无法使用QGraphicsLayouts令人不快地感到惊讶。这是因为QGraphicsLayouts接受了从QGraphicsLayoutItem继承的项目,QGraphicsItems由QGraphicsLayoutItems继承,而QGraphicsLayoutItems又由QGraphicsWidgets继承。

有一个QGraphicsItem / QGraphicsWidget的graphicsItem属性,但是查看代码,我认为我不能将我的Item分配给这个属性并让它们正常工作。我确实找到了this example,但奇怪的是它有从两个类继承的例子。我很困惑。

所以我正在尝试找到让我的项目在Layouts中工作的最简单方法。有没有比从这两个类中的一个重写和继承更简单的方法呢?

第二个问题,你应该从QGraphicsWidget继承你应该从QGraphicsLayoutItem继承的时候有一个经验法则吗?

用于解释何时使用sizeHint与boundingRect的额外信用。

感谢帮助, 布雷特

1 个答案:

答案 0 :(得分:3)

使布局中的项目工作的最简单方法是将继承更改为QGraphicsWidget并覆盖setGeometry()和sizeHint()方法。应该是一个简单的改变,因为你的项目仍然是继承祖先的QGraphicsItems。

Qt Graphics View框架旨在尽可能轻量级。因此,有许多选择来组装具有不同能力的物品。如果布局中的项目大小不是问题,您可以从QGraphicsWidget继承。否则,继承自QGraphicsLayoutItem(除非您需要QGraphicsWidget的额外功能)。由于您无法从PyQt类中继承多次,因此您必须使用合成来创建由QGraphicsLayoutItem控制的项目,就像您引用的示例一样。

场景使用boundingRect()方法来管理项目。布局使用sizeHint()方法来确定布局项的大小。场景使用shape()方法来更精确地确定项目的位置(用于碰撞,命中测试等)。

相关问题