qt - QGraphicsWidget 与 QGraphicsLayoutItem

标签 qt pyqt

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

我首先创建了几个 QGraphicsItem 重载作为构建 block 。一旦我让它们按照我想要的方式工作,我想尝试将它们组合起来,并且惊讶地发现我无法在 QGraphicsLayouts 中使用它们。这是因为 QGraphicsLayouts 采用继承自 QGraphicsLayoutItem 的项目,而 QGraphicsItems 由 QGraphicsLayoutItems 继承,而 QGraphicsLayoutItems 又由 QGraphicsWidgets 继承。

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

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

第二个问题,对于何时应该从 QGraphicsWidget 继承与何时应该从 QGraphicsLayoutItem 继承,是否有经验法则?

解释何时使用 sizeHint 与 boundingRect 的额外功劳。

感谢帮助, 布雷特

最佳答案

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

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

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

关于qt - QGraphicsWidget 与 QGraphicsLayoutItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4116657/

相关文章:

python - PyQt 多行文本输入框

qt - 如何在 QWidget 中使用 QmainWindow?

c++ - C++ 中的值访问

pyqt - 使用 GUI 重启 QThread

python - 更新 QGraphicsItem 的不透明度

qt - QDialog : how to use question mark (?)按钮?

javascript - 需要有关此主题的完整示例 : QtWebKit Bridge

c++ - QT SDL 未被识别(列出了 Qmake 文件。我做错了吗?)

linux - 防止monitor在linux上进入待机状态

python - 如何每页显示 1 个字符串? (PyQt/Python)