Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QGraphicsWidget与QGraphicsLayoutItem_Qt_Pyqt - Fatal编程技术网

Qt QGraphicsWidget与QGraphicsLayoutItem

Qt QGraphicsWidget与QGraphicsLayoutItem,qt,pyqt,Qt,Pyqt,我第一次使用QGraphicsView/Scene。这是在PyQt中,但除了Python与多重继承不同之外,我认为这是一个通用的Qt问题 我首先创建了几个QGraphicsItem重载作为构建块。一旦我有了那些我想要的工作方式,我想尝试将它们结合起来,并且令人不快地惊讶地发现我不能在QGraphicsLayouts中使用它们。这是因为QGraphicsLayouts接受从QGraphicsLayoutItem继承的项,而QGraphicsSitems由QGraphicsLayoutItems继承

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

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

QGraphicsItem/QGraphicsWidget有一个graphicsItem属性,但是看看代码,我认为我无法将我的项目分配给这个属性并使它们正常工作。我确实发现了,但奇怪的是,它有从两个类继承的示例。我很困惑

因此,我试图找到最简单的方法,让我的项目在布局工作。有没有比重写和继承这两个类中的一个更简单的方法呢

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

解释何时使用sizeHint和boundingRect时的额外积分

感谢你的帮助,
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(和相关类)。