3

paintEvent()Qt4 アプリケーションでは、再描画がサイズ変更によってトリガーされたかどうかをハンドラー内で伝えることは可能ですか?

再描画が非常に遅いウィジェット (複雑なプロット) があり、ウィジェットのサイズ変更中にサイズ変更されたピックスマップをブリットするだけでサイズ変更を高速化し、サイズ変更が完了したときにのみウィジェットを再描画したいと考えています。

の最初と最後にフラグを設定/設定解除しようとしましたresizeEvent()が、うまくいかないようです (つまり、 ではフラグは常にオフになっていpaintEvent()ます)。

4

3 に答える 3

5

私はあなたがこれを簡単に行うことができるとは思わない。特にクロスプラットフォームの方法では、サイズ変更がいつ開始/停止したかを判断するのはちょっと難しいです。おそらく、 によってトリガーされるシングルショットタイマーがresizeEventあり、画像を にレンダリングしますQPixmapresizeEventタイマーがまだアクティブな間に別のものを取得した場合は、再起動してください。常に現在paintEventのピックスマップを描画し、タイマーから新しいピックスマップをレンダリングした後update()、ウィジェットを呼び出します。理想的な解決策ではありませんが、うまくいくはずです。

于 2009-10-05T16:11:04.633 に答える
2

1 つの方法として、常にピックスマップを描画することができますが、ウィンドウ サイズが変更された場合は、「すぐに」ピックスマップを再作成することを忘れないでください。

そのため、paintEvent が入ったときに、サイズが現在のピックスマップのサイズと異なる場合は、保存されているピックスマップをとにかくペイントしますが、QTimerを設定 (またはリセット) して、ピックスマップを更新するスロットへの信号をトリガーします。

この更新メソッドが実行されると、ピックスマップが再レンダリングされ、ウィジェットの更新が要求されます。

于 2009-10-05T16:14:57.527 に答える
1

もう 1 つの可能性は、QMdiSubWindow::RubberBandResizeが内部でどのように実装されているかを調べることです。これを達成する方法についてのヒントが得られるかもしれません。私が正しく思い出すと、QMdiSubwindowでのみ機能します-サイズ変更中にペイントを「停止」し(透明なボディを持つ小さなウィンドウ境界を除く)、ウィンドウのサイズ変更を停止すると、最後のresizeEvent(更新/ペイントをトリガーします)を1つ起動します...

于 2009-10-15T21:02:14.487 に答える