2012-08-04 1 views
2

저는 QPainter에 대해 배우고 있습니다. 사용자가 위젯을 클릭 할 때마다 그 지점에 새로운 원이 표시되는 간단한 위젯을 만들었습니다.불필요하게 모든 것을 다시 칠하지 않고 Qt의 위젯에 원을 추가하는 방법은 무엇입니까?

enter image description here

하지만 Qt는 paintEvent 외부 그림을 허용하지 않기 때문에 나는 새로운 원을 그리 할 때마다, 나는 너무, 위젯 영역을 무효화하고 이전의 모든 원을 다시 그릴 필요가있다. 그렇게 효율적이지는 않습니다. 수백 또는 수천 개의 요소가 있다면 어떨까요?

위의 원이 지워지지 않았 으면 좋겠다. 이제 방금 위젯 위에 새로운 것을 그렸다. 하지만 Qt에서는 이전 내용을 먼저 무효화 (그리고 따라서 지우기)하지 않고 그릴 수 없습니다.

Qt에서이 상황을 처리 할 때 권장되는 방법은 무엇입니까?

답변

1

해당 상황을 처리하는 데 권장되는 방법은 QGraphicsSceneQGraphicsView을 사용하고 QGraphicsItems으로 장면을 채우는 것입니다. docs에 따르면 프레임 워크가 설계된 것입니다.

요약하면 QGraphicsScene::mousePressEvent()을 무시하고 새로운 방법으로 new QGraphicsEllipseItem을 만듭니다.

1

전체 위젯을 무효화 할 필요가 없습니다. update() 및 repaint()는 다시 그리려는 좌표를 취할 수 있으므로 변경된 부분 만 다시 그립니다.

void update (int x, int y, int w, int h) 
void update (const QRect & rect) 
void update (const QRegion & rgn) 

void repaint (int x, int y, int w, int h) 
void repaint (const QRect & rect) 
void repaint (const QRegion & rgn)