PyQt:移动具有不同ItemIgnoresTransformations标志的多个项

PyQt:移动具有不同ItemIgnoresTransformations标志的多个项,qt,pyqt,qgraphicsview,qgraphicsitem,qgraphicsscene,Qt,Pyqt,Qgraphicsview,Qgraphicsitem,Qgraphicsscene,有时选定的项目不会一起移动 这在具有两种类型的项的应用程序中发生: “常规项目” 带有itemIgnorestTransformations标志的“句柄”(缩放时必须保持相同大小) 当它们一起被选中并用鼠标移动时,它们的平移量应该相同(它们应该作为一个整体移动)。当仅移动“常规项”或“句柄”时,它可以正常工作,但在同时选择这两种类型时则不行 下面是一个显示问题的最小示例。 还可以在上找到它,以及一个增强版本,该版本还显示了项目的某些属性 import sys from PyQt4 impor

有时选定的项目不会一起移动

这在具有两种类型的项的应用程序中发生:

  • “常规项目”
  • 带有
    itemIgnorestTransformations
    标志的“句柄”(缩放时必须保持相同大小)
当它们一起被选中并用鼠标移动时,它们的平移量应该相同(它们应该作为一个整体移动)。当仅移动“常规项”或“句柄”时,它可以正常工作,但在同时选择这两种类型时则不行

下面是一个显示问题的最小示例。 还可以在上找到它,以及一个增强版本,该版本还显示了项目的某些属性

import sys
from PyQt4 import QtGui, QtCore

class View(QtGui.QGraphicsView):
    def __init__(self):
        QtGui.QGraphicsView.__init__(self)

        self.scene = QtGui.QGraphicsScene(self)
        #self.scene.setSceneRect(QtCore.QRectF(0, 0, 245, 245))

        self.setScene(self.scene)

        self.item1 = QtGui.QGraphicsRectItem(0, 0, 60, 40)
        self.item1.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.item1.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
        self.scene.addItem(self.item1)

        self.item2 = QtGui.QGraphicsRectItem(0, 0, 40, 60)
        self.item2.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.item2.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)
        self.item2.setFlag(QtGui.QGraphicsItem.ItemIgnoresTransformations, True)
        self.scene.addItem(self.item2)

        self.item1.setSelected(True)
        self.item2.setSelected(True)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    view = View()
    view.show()
    sys.exit(app.exec_())
这两个项目都已选定。单击一个项目并拖动(比如向左移动)似乎只移动一个项目。这似乎是在更新
sceneboundingdirect
时发生的。向后移动(比如说向右移动),这两个词会一起翻译,直到必须再次放大
sceneboundingdirect

如果未对
setscen直立
行进行注释,则行为是正确的

itemIgnorestTransformation

该项忽略继承的变换(即,其位置仍定位到其父项,但忽略父项或视图旋转、缩放或剪切变换)。此标志对于保持文本标签项水平且不缩放非常有用,因此,如果视图被转换,它们仍然是可读的。设置后,项目的视图几何体和场景几何体将分别维护。您必须调用deviceTransform(),在视图中映射坐标并检测碰撞。默认情况下,此标志处于禁用状态。Qt4.3中引入了此标志。注意:设置此标志后,您仍然可以缩放项目本身,并且缩放变换将影响项目的子项

我问了一个关于第一句黑体字的具体问题。这可能与此相关

在阅读和搜索时,
deviceTransform()
似乎不会做任何像更新boundingRect这样的神奇事情。这真的有用吗?怎么做

建议不要使用
ItemIgnoresTransformations
标志。但这是关于父母/孩子的关系

值得一读,但更多的是关于父母/孩子的

这也很有趣,但改变起源并不能改变这里的核心问题

因此,有几种可能的解决方案(当然,显示解决方案的答案也会很有用),但我更想对这里发生的事情进行深入的解释。

field