开发者

Qt: Using QTransform object for rotate differs from setting setRotation() in QGraphicsItem

开发者 https://www.devze.com 2023-04-09 10:03 出处:网络
While setting a QGraphicsItem rotation, I get different results upon the transformation origin point while using setRotation() and using:

While setting a QGraphicsItem rotation, I get different results upon the transformation origin point while using setRotation() and using:

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

In both portion of code, I set setTransformOriginPoint() to the same point.

Results are:

  • While using setRotation() method, the item is rotated upon its transformation origin point.
  • While using the QTransform object, the item is rotated upon item's origin, that is, point (0,0).

My code is more complex than that, but I think It applies the same. The QGraphicsItem is in fact a QGraphicsItemGroup and I can check the issue adding just one item, and in my rotation procedure change the setRotation() method for the QTransform object. The latter, ignores the setTransformOriginPoint().

I'm having this issue for a while, and I dig a lot of resources. I browse the Qt C++ code, and I can see that the setRotation() method modifies a field calles rotation (a real value) in the TransformData structure within the QGraphicsItem. The origin point is also a two field real value in such a structure called xOrigin and yOrigin respectively. The transformation is stored in the tranform field. All this information is used in a variable called: transformData.

So, I don't get why the transformation set in the transformData->transform field is ignoring the values transformData->xOrigin and transformData->yOrigin at the time of being applied.

The code I used to test that issue is the following relevant part (I have an rotate item that receives mouse inputs and applies rotation to the item itself):

# 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)

On both, previously the setTransformOriginPoint() is set, but it's not a relevant part to show the code, but just to know that it is done.

I'm getting frustrated to not find a solution to it. As it seems so straightforward, why setting a rotation transformation matrix does not use the transformation origin point that I have set and while using setRotation() method works fine? That question took me to the source code, but now is more confusing as rotation is keeping separated from the transformation applied...


I was solving the same problem. I found out that QGraphicsItem::setTransformOriginPoint() is accepted only for QGraphicsItem::setRotation(). It is ignored for QGraphicsItem::setTransform().

I use this code to reach the same behavior for 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 )
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号