在设置 QGraphicsItem
旋转时,使用 setRotation()
和以下方法时,不同的转换原点将引起不同的结果:
transform = QTransform()
transform.rotate(myAngle)
myItem.setTransform(transform)
在这两个代码片段中,我都将
setTransformOriginPoint()
设置为相同的点。结果如下:
- 使用
setRotation()
方法时,项目会围绕其变换原点旋转。 - 使用
QTransform
对象时,项目会围绕其原点(即点(0,0))旋转。
QGraphicsItem
实际上是一个QGraphicsItemGroup
,我可以添加一个项目来检查此问题,并在旋转过程中将setRotation()
方法更改为QTransform
对象。后者忽略了setTransformOriginPoint()
。这个问题已经困扰我一段时间了,我浏览了很多资源。我浏览了Qt C++代码,发现
setRotation()
方法修改了QGraphicsItem
中TransformData
结构体中的rotation
字段(一个实值)。原点也是该结构中两个字段real值,分别称为xOrigin
和yOrigin
。变换存储在tranform
字段中。所有这些信息都在一个名为transformData
的变量中使用。因此,我不明白为什么在应用时,
transformData-> transform
字段中设置的变换会忽略transformData->xOrigin
和transformData->yOrigin
的值。我用于测试该问题的代码是以下相关部分(我有一个rotate item接收鼠标输入并将旋转应用于项目本身):
# This method using QTransform object....
def mouseMoveEvent(self, event):
if self.pressed:
parent = self.parentItem()
parentPos = parent.boundingRect().center()
newPoint = event.scenePos()
iNumber = (newPoint.x()-parentPos.x())-((newPoint.y()-parentPos.y()))*1j
angle = cmath.phase(iNumber)+1.5*math.pi
self.appliedRotation = (360-math.degrees(angle))%360 - self.angleOffset
transform = QTransform()
transform.rotate(self.appliedRotation)
self.parentItem().setTransform(transform)
# ...Against this one using setRotation()
def mouseMoveEvent(self, event):
if self.pressed:
parent = self.parentItem()
parentPos = parent.boundingRect().center()
newPoint = event.scenePos()
iNumber = (newPoint.x()-parentPos.x())-((newPoint.y()-parentPos.y()))*1j
angle = cmath.phase(iNumber)+1.5*math.pi
self.appliedRotation = (360-math.degrees(angle))%360 - self.angleOffset
self.parentItem().setRotation(self.appliedRotation)
在两个代码段中,之前都设置了setTransformOriginPoint()
,但这不是展示代码的相关部分,只是为了知道已经完成了该操作。
我很沮丧找不到解决方法。看起来这么简单,为什么设置旋转变换矩阵不使用我设置的变换原点,而使用setRotation()
方法却可以正常工作呢?这个问题让我去查看源代码,但现在更加困惑了,因为旋转与应用的变换是分开的...