Qt:使用QTransform对象进行旋转与在QGraphicsItem中设置setRotation()有所不同

3

在设置 QGraphicsItem 旋转时,使用 setRotation() 和以下方法时,不同的转换原点将引起不同的结果:

transform = QTransform()
transform.rotate(myAngle)
myItem.setTransform(transform)

在这两个代码片段中,我都将setTransformOriginPoint()设置为相同的点。
结果如下:
  • 使用setRotation()方法时,项目会围绕其变换原点旋转。
  • 使用QTransform对象时,项目会围绕其原点(即点(0,0))旋转。
我的代码比这个复杂,但是我认为它适用于相同的问题。 QGraphicsItem实际上是一个QGraphicsItemGroup,我可以添加一个项目来检查此问题,并在旋转过程中将setRotation()方法更改为QTransform对象。后者忽略了setTransformOriginPoint()
这个问题已经困扰我一段时间了,我浏览了很多资源。我浏览了Qt C++代码,发现setRotation()方法修改了QGraphicsItemTransformData结构体中的rotation字段(一个实值)。原点也是该结构中两个字段real值,分别称为xOriginyOrigin。变换存储在tranform字段中。所有这些信息都在一个名为transformData的变量中使用。
因此,我不明白为什么在应用时,transformData-> transform字段中设置的变换会忽略transformData->xOrigintransformData->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()方法却可以正常工作呢?这个问题让我去查看源代码,但现在更加困惑了,因为旋转与应用的变换是分开的...

1个回答

3

我也遇到了同样的问题。我发现QGraphicsItem::setTransformOriginPoint()只对QGraphicsItem::setRotation()有效,而对于QGraphicsItem::setTransform()则被忽略。

我使用下面的代码来实现QTransform()的相同行为:

transform = QtGui.QTransform()
centerX = item.boundingRect().width()/2
centerY = item.boundingRect().height()/2
transform.translate( centerX , centerY  )
transform.rotate( -rotation )
transform.translate( -centerX , -centerY )
item.setTransform( transform )

我稍后会回顾我的代码,随着时间的推移,我会给你一个答复。我换了工作,我的项目已经停滞了一段时间。敬礼。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接