为什么 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
上面的结果是p1
和p2
都是添加到布局中的空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()
相应。
到目前为止,我有以下代码:
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 |
上面的结果是p1
和p2
都是添加到布局中的空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()
相应。