2014-10-06 4 views
0

그래픽 장면에 타원을 그립니다. 타원이 기울어지면 경계의 일부가 즉시 나타나지 않습니다. 내 그래픽 장면에서 창 크기를 조정하거나 확대 또는 축소 작업을 수행 한 후에 타원 경계가 업데이트되고 필요한 완벽한 모양을 얻습니다.QGraphicsScene이 즉시 업데이트되지 않습니다.

나는 나의 타원 내 페인트 기능을 정의했습니다 :

QPainterPath ellipse; 
ellipse.moveTo(p1.x()+majRadius, p1.y()); 
ellipse.arcTo(boundingRect(), 0 , 360); 
QPen paintpen(Qt::black); 
paintpen.setWidth(1); 
painter->setRenderHint(QPainter::Antialiasing); 
painter->setPen(paintpen); 
painter->save(); 
painter->translate(p1.x(), p1.y()); 
painter->rotate(theta); 
painter->translate(-p1.x(), -p1.y()); 
painter->drawPath(ellipse); 
painter->restore(); 

내 경계의 구형의 정의는 다음과 같습니다

return QRectF(p1.x()-majRadius, p1.y()-minRadius, 
       2*majRadius, 2*minRadius).normalized(); 

나는 타원 2 례의 스크린 샷을 첨부 : enter image description here

이 문제를 해결하는 방법은 무엇입니까?

답변

2

중요한 코드는 표시하지 않았지만 문제가 무엇인지 추측 할 수 있습니다.

QGraphicsItem::boundingRect()에 영향을 미치는 QGraphicsItem의 일부 속성을 변경하면 QGraphicsItem::prepareGeometryChange이 아니라 update으로 전화해야합니다.
QGraphicsItem::boundingRect의 문서를 참조하십시오.

두 번째 문제점은 회전 변환 및 경계 사각형을 엉망으로 만든다는 것입니다. 화가 자체가 아니라 화가 경로 만 회전 시키십시오.

내가 볼 수있는 또 다른 문제는 당신이 화가를 저장하고 잘못된 방향으로 복원한다는 것입니다. 화가에 대한 변경 (예 : painter->setRenderHint(QPainter::Antialiasing);) 이전)을 수행하고 항목 채색이 완료된 후 상태를 복원하기 전에 저장해야합니다 (Ok입니다).

+0

많은 실수를 지적 해 주셔서 감사합니다. 제공된 화가 경로 예제를 따랐습니다. 번역문과 회전을위한 문서에서'preparegeometrychange'에 와서, 힌트를 제공 할 수 있다면 그것을 사용하는 방법을 알아낼 수 없었습니다. –

+0

'preparegeometrychange' 함수는 어디에서 호출해야합니까? –

+0

영향을주는 각 메소드 'p1','majRadius','minRadius','theta'는'boundingRect()'에 영향을 미치므로'preparegeometrychange'를 호출해야합니다. –

관련 문제