为什么 QGraphicsGridLayout 不处理放置在场景中的项目的行和列放置?

Why QGraphicsGridLayout doesn't handle row and column placement of items placed on a scene?

到目前为止,我有以下代码:

 p1 = QGraphicsWidget(self.scene.addItem(QGraphicsPixmapItem(self.pixmap)))
 p2 = QGraphicsWidget(self.scene.addItem(QGraphicsPixmapItem(self.pixmap)))
self.grid.addItem(pixmap, 0, 0)
    self.grid.addItem(pixmap2, 0,1 )
    f = QGraphicsWidget()
    f.setLayout(self.grid)
    self.scene.addItem(f)

出于某种原因,那些相等的像素图被放在彼此身上。趁我要紧挨着。

w1 = self.scene.addItem(QGraphicsPixmapItem(self.pixmap))
w1.setPos(0,0)
pixmap = QGraphicsWidget(w1)
w2 = self.scene.addItem(QGraphicsPixmapItem(self.pixmap))
w2.setPos(200,0)
pixmap2 = QGraphicsWidget(w2)
self.grid.addItem(pixmap, 0, 0)
self.grid.addItem(pixmap2, 0,1 )
f = QGraphicsWidget()
f.setLayout(self.grid)
self.scene.addItem(f)

此代码工作过度,但 QGraphicsGridLayout 不应该处理放置吗?

QGraphicsScene.addItem() returns None.

您不是将像素图项添加到 QGraphicsWidget,而是直接将它们添加到场景。此外,QGraphicsWidget 的构造函数中的 first parameter 是一个 parent,因此无论如何它都无效;结果是您实际上是在向布局中添加空的 QGraphicsWidgets。

让我们按照执行顺序来分析前两行,这是问题所在:

QGraphicsWidget(self.scene.addItem(QGraphicsPixmapItem(self.pixmap)))
                                   ^^^^^^^^^^^^^^^^^^^(^^^^^^^^^^^)
                ^^^^^^^^^^^^^^^^^^(               1.               )
^^^^^^^^^^^^^^^(         2.                                         )
      3.

请记住,使用“嵌套”函数调用意味着 outer 调用始终使用 inner[=53= 的 returned 值] 调用,就像带方括号的数学表达式一样,首先执行 inner 调用,原因很明显:在评估内部括号的结果之前,您无法求解外括号内的表达式。
在上面的例子中,3将使用2的return值,将使用1的return值执行。

command current argument result returned object
1. QGraphicsPixmapItem(self.pixmap) QPixmap create an item that will display the given pixmap an instance of QGraphicsPixmapItem
2. self.scene.addItem(...) QGraphicsPixmapItem instance adds the given item to the scene None
3. QGraphicsWidget(...) None create an empty QGraphicsWidget without parents QGraphicsWidget instance

上面的结果是p1p2都是添加到布局中的空QGraphicsWidget项,而pixmap项是直接添加到场景中的,这就是为什么它们出现重叠。这两行可以这样写,得到相同的结果:

self.scene.addPixmap(self.pixmap)
self.scene.addPixmap(self.pixmap)
p1 = QGraphicsWidget()
p2 = QGraphicsWidget()

现在的问题是,只有 QGraphicsLayoutItem 子类可以添加到 QGraphicsLayout,而你不能只添加标准 QGraphicsItem,所以可能的解决方案是创建一个基本的 QGraphicsLayoutItem 子类,它将作为“容器” pixmap 项目,并实现所需的功能,如 the documentation.

中所述
class PixmapLayoutItem(QGraphicsLayoutItem):
    def __init__(self, pixmap, parent=None):
        super().__init__(parent)
        self.pixmapItem = QGraphicsPixmapItem(pixmap)
        self.setGraphicsItem(self.pixmapItem)

    def sizeHint(self, which, constraint=None):
        return self.pixmapItem.boundingRect().size()

    def setGeometry(self, geometry):
        self.pixmapItem.setPos(geometry.topLeft())


# ...

p1 = PixmapLayoutItem(self.pixmap)
p2 = PixmapLayoutItem(self.pixmap)
self.grid.addItem(p1, 0, 0)
self.grid.addItem(p2, 0, 1)
f = QGraphicsWidget()
f.setLayout(self.grid)
self.scene.addItem(f)

请注意,上面的子类非常基础,不会考虑嵌入项的任何转换:如果你想支持那些(如缩放或旋转),你必须实现sizeHint()setGeometry() 相应。