Qt: Использование объекта QTransform для поворота отличается от установки setRotation () в QGraphicsItem - PullRequest
3 голосов
/ 28 сентября 2011

При установке поворота 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 ) в структуре TransformData в пределах QGraphicsItem. Начальная точка также представляет собой значение из двух полей real в такой структуре, которое называется xOrigin и yOrigin соответственно. Преобразование сохраняется в поле tranform. Вся эта информация используется в переменной с именем: transformData.

Итак, я не понимаю, почему преобразование, установленное в поле transformData->transform, игнорирует значения transformData->xOrigin и transformData->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() все работает нормально? Этот вопрос привел меня к исходному коду, но теперь он более запутанный, поскольку ротация отделена от примененного преобразования ...

1 Ответ

2 голосов
/ 19 декабря 2011

Я решал ту же проблему.Я обнаружил, что 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 )
...