QGraphicsItem
회전을 설정하는 동안
setRotation()
를 사용하고 다음을 사용하여 변환 원점에서 다른 결과를 얻습니다.
Qt : 회전을위한 QTransform 객체 사용은 QGraphicsItem의 setRotation() 설정과 다릅니다.
transform = QTransform()
transform.rotate(myAngle)
myItem.setTransform(transform)
코드의 두 부분에서 setTransformOriginPoint()
을 같은 지점으로 설정합니다.
결과는 다음과 같습니다.
setRotation()
메소드를 사용하는 동안 항목은 변환 원점을 기준으로 회전합니다.QTransform
객체를 사용하는 동안 항목은 항목의 원점, 즉 (0,0) 점에 따라 회전됩니다.
내 코드는 그보다 복잡하지만 생각해 보면 똑같습니다. QGraphicsItem
은 실제로 QGraphicsItemGroup
이며 한 항목 만 추가하여 문제를 확인할 수 있습니다. 회전 프로 시저에서 QTransform
메서드에 대한 setRotation()
메서드를 변경합니다. 후자는 setTransformOriginPoint()
를 무시합니다.
잠시 동안이 문제가 발생했습니다. 많은 리소스를 파냅니다. Qt C++ 코드를 탐색하면 setRotation()
메서드가 필드를 수정하여 QGraphicsItem
내의 TransformData
구조에서 rotation
( 실제 값)을 호출하는 것을 볼 수 있습니다. 원점은 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()
메서드를 사용하는 동안 잘 작동합니까? 그 질문은 나를 소스 코드로 데려 갔지만 회전이 적용된 변환과 분리되어 있기 때문에 더 혼란 스럽다.
나중에 내 코드에 도달하고 시간 나는 당신이에 응답을주는이를 확인할 수 있습니다. 나는 일자리를 바꾸었고 프로젝트는 잠시 중단되었습니다. 문안 인사. – Sebastian