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