2009-10-05 8 views
4

Qt4 응용 프로그램에서 paintEvent() 처리기 내부에 리사인이 크기 조정에 의해 트리거되었는지 여부를 알릴 수 있습니까?Qt4에서 paintEvent가 크기 조정에 의해 트리거되는지 확인하는 방법은 무엇입니까?

나는 (복잡한 플롯을) 다시 그리기 매우 느린 위젯을 가지고, 난 그냥 위젯 크기가 조절되는하면서 크기가 조정 된 픽스맵 블리 팅에 의해 크기를 조절 속도를 원하고, 단지 위젯을 다시 그릴 때 크기 조정 완료되었습니다.

(즉, 플래그가 paintEvent()에 항상 꺼져) 나는 시작과 resizeEvent()의 끝에서 플래그를 설정 해제/설정을 시도했지만 그 작동하지 않습니다.

답변

6

나는 이것을 쉽게 할 수 있다고 생각하지 않습니다. 특히 크로스 플랫폼 방식으로 크기 조정을 시작할 때/중단 할 때를 말하기는 어렵습니다. 나는 에 의해 트리거 된 단일 샷 타이머를 가지고있을 것이고, 이는 이미지를 QPixmap에 렌더링 할 것입니다. 타이머가 활성화되어있는 동안 또 다른 resizeEvent이 발생하면 다시 시작하십시오. paintEvent에서 항상 현재 픽스맵을 페인팅하고 타이머에서 새 픽스맵을 렌더링 한 후 위젯에서 update()으로 호출하십시오. 이상적인 솔루션은 아니지만 작동해야합니다.

+0

고마워, 이런 식으로 뭔가를 구현하고 잘 작동하는 것 같습니다. 또한 마우스 왼쪽 버튼이 눌려져 있으면 타이머가 다시 시작되므로 다시 크기 조정을 일시 중지하면 다시 그리기가 트리거되지 않습니다. –

+0

좋은 질문에 좋은 답변. +1 – zaharpopov

3

취할 수있는 방법 중 하나는 항상 픽스맵을 페인팅하는 것이지만 창 크기가 변경되면 "곧"픽스맵을 다시 만들어야합니다.

paintEvent가 들어 왔을 때 크기가 현재의 pixmap 크기와 다른 경우 어쨌든 저장된 pixmap을 페인트 한 다음 QTimer을 설정 (또는 재설정)하여 pixmap을 새로 고칠 슬롯으로 신호를 트리거합니다 .

이 새로 고침 메소드가 실행되면 픽스맵을 다시 렌더링하고 위젯 새로 고침을 요청합니다.

1

또 다른 가능성은 내부적으로 QMdiSubWindow::RubberBandResize이 구현 된 방법을 살펴 보는 것일 수 있으며이를 달성하는 방법에 대한 힌트를 제공 할 수 있습니다. 올바르게 호출 한 경우 QMdiSubwindow에서만 작동합니다. 크기 조정 중에 작은 창 경계를 제외하고 페인팅을 중지하고 창 크기 조정을 중지하면 마지막 resizeEvent (업데이트/페인트를 트리거 함)를 발생시킵니다.