gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:30:36 27 4
gpt4 key购买 nike

在设置 QGraphicsItem 旋转时,我在使用 setRotation() 时在转换原点上得到了不同的结果并使用:

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

在这两部分代码中,我都将 setTransformOriginPoint() 设置为相同的点。

结果是:

  • 在使用 setRotation() 方法时,项目在其变换原点上旋转。
  • 在使用 QTransform 对象时,项目在项目原点旋转,即点 (0,0)

我的代码比那更复杂,但我认为它同样适用。 QGraphicsItem 实际上是一个 QGraphicsItemGroup,我可以检查只添加一个项目的问题,并在我的旋转过程中更改 setRotation() 方法对于 QTransform 对象。后者忽略 setTransformOriginPoint()

这个问题困扰我有一段时间了,我挖掘了很多资源。我浏览 Qt C++ 代码,我可以看到 setRotation() 方法修改了一个字段 calles rotation (一个 real 值) QGraphicsItem 中的 TransformData 结构。原点也是这样一个结构中的两个字段 real 值,分别称为 xOriginyOrigin。转换存储在 tranform 字段中。所有这些信息都用在一个名为:transformData 的变量中。

所以,我不明白为什么在 transformData->transform 字段中设置的转换会忽略值 transformData->xOrigintransformData-> yOrigin 在被应用时。

我用来测试该问题的代码是以下相关部分(我有一个旋转项目,它接收鼠标输入并对项目本身应用旋转):

# 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() 方法却能正常工作?这个问题把我带到了源代码,但现在更加困惑,因为旋转与应用的转换保持分离......

最佳答案

我正在解决同样的问题。我发现 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 )

关于Qt:使用 QTransform 对象进行旋转不同于在 QGraphicsItem 中设置 setRotation(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7577371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com