Qt QGraphicsWidget与QGraphicsLayoutItem
我第一次使用QGraphicsView/Scene。这是在PyQt中,但除了Python与多重继承不同之外,我认为这是一个通用的Qt问题 我首先创建了几个QGraphicsItem重载作为构建块。一旦我有了那些我想要的工作方式,我想尝试将它们结合起来,并且令人不快地惊讶地发现我不能在QGraphicsLayouts中使用它们。这是因为QGraphicsLayouts接受从QGraphicsLayoutItem继承的项,而QGraphicsSitems由QGraphicsLayoutItems继承,而QGraphicsLayoutItems又由QGraphicsWidgets继承 QGraphicsItem/QGraphicsWidget有一个graphicsItem属性,但是看看代码,我认为我无法将我的项目分配给这个属性并使它们正常工作。我确实发现了,但奇怪的是,它有从两个类继承的示例。我很困惑 因此,我试图找到最简单的方法,让我的项目在布局工作。有没有比重写和继承这两个类中的一个更简单的方法呢 第二个问题,对于何时应该从QGraphicsWidget继承,与何时应该从QGraphicsLayoutItem继承,是否有经验法则 解释何时使用sizeHint和boundingRect时的额外积分 感谢你的帮助,Qt QGraphicsWidget与QGraphicsLayoutItem,qt,pyqt,Qt,Pyqt,我第一次使用QGraphicsView/Scene。这是在PyQt中,但除了Python与多重继承不同之外,我认为这是一个通用的Qt问题 我首先创建了几个QGraphicsItem重载作为构建块。一旦我有了那些我想要的工作方式,我想尝试将它们结合起来,并且令人不快地惊讶地发现我不能在QGraphicsLayouts中使用它们。这是因为QGraphicsLayouts接受从QGraphicsLayoutItem继承的项,而QGraphicsSitems由QGraphicsLayoutItems继承
Brett让项目在布局中工作的最简单方法是将继承更改为QGraphicsWidget,并重写setGeometry()和sizeHint()方法。这应该是一个简单的改变,因为您的项目仍然是通过继承祖先的QGraphicsItems Qt图形视图框架设计为尽可能轻量级。因此,组装具有不同功能的项目有很多选择。如果布局中的项目大小不受关注,则可以从QGraphicsWidget继承。否则,从QGraphicsLayoutItem继承(除非您需要QGraphicsWidget的额外功能)。由于不能从PyQt类进行乘法继承,因此必须使用composition来创建由QGraphicsLayoutItem控制的项,如您引用的示例中所示
场景使用boundingRect()方法来管理项目。布局使用sizeHint()方法确定布局项的大小。场景使用shape()方法更精确地确定项目的位置(用于碰撞、命中测试等)。您能详细介绍一下吗?我的问题是,如果我从QGraphicsItem继承,我必须重写boundingRect。但如果我从QGraphicsWidget继承,我就不会。即使QGraphicsWidget继承自QGraphicsItem。因此,显然有一个非抽象的实现。在我看来,sizeHint、setGeometry和boundingRect都是耦合的。为了解释您的答案,在我看来,boundingRect()和sizeHint()都“被场景用于管理项目”。是的,sizeHint、setGeometry和boundingRect是耦合的,因为它们都与小部件的大小和位置相关。sizeHint告诉布局小部件希望的大小。setGeometry是布局告诉小部件它应该的大小的方式。boundingRect是小部件告诉场景其大小的方式。QGraphicscene不使用sizeHint()。它仅用于QGraphicsLayout(和相关类)。