2011-09-28 3 views
3
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 ( 실제 값)을 호출하는 것을 볼 수 있습니다. 원점은 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() 메서드를 사용하는 동안 잘 작동합니까? 그 질문은 나를 소스 코드로 데려 갔지만 회전이 적용된 변환과 분리되어 있기 때문에 더 혼란 스럽다.

답변

2

동일한 문제를 해결하고있었습니다. 나는 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) 
+0

나중에 내 코드에 도달하고 시간 나는 당신이에 응답을주는이를 확인할 수 있습니다. 나는 일자리를 바꾸었고 프로젝트는 잠시 중단되었습니다. 문안 인사. – Sebastian