17

私の素晴らしいスクロールウィジェットの父となるQScrollAreaがあります。いろいろな場面で内容を更新していきたいです。

このために、のオーバーライドを行いましたpaintEvent(QPaintEvent *)。その後、それを実行したいときはいつでもupdate()、ウィジェットを呼び出します。

問題: paintEvent()これによって呼び出されることはありません!

これまでのトラブルシューティングで試したこと:

  • repaint()の代わりに使用してくださいupdate()。すぐに呼び出す必要があります。残念ながらそうではありません。
  • isVisible()とのテストupdatesEnabled
  • オーバーライドが正しいかどうかをテストします。ウィンドウのサイズを変更すると、関数が呼び出されます。手動のupdate()、repaint()呼び出しのみが失敗します。
  • QTimerを実装して、500ミリ秒ごとにupdate()またはrepaint()をトリガーします。トリガーはテキスト出力を提供し、関数は呼び出されません。

誰かが次に何をチェックするべきか考えましたか?repaint()がpaintEvent()を呼び出さないようにするにはどうすればよいですか?

4

1 に答える 1

28

解決策は、またはの代わりに、派生クラスからthis->viewport()->repaint()またはを呼び出すことです。this->viewport()->update()QAbstractScrollArearepaint()update()

詳細については、Qtのドキュメントをご覧ください。

QWidget * QAbstractScrollArea::viewport () const

ビューポートウィジェットを返します。この関数を使用してQScrollArea::widget()、ビューポートウィジェットのコンテンツを取得します。

派生クラスにあるコンテンツQAbstractScrollAreaはビューポートウィジェットに表示されるため、ビューポートウィジェットの更新を呼び出すか、再描画してデータを再度描画するのが理にかなっています(paintEvent呼び出されます)。

于 2010-07-23T12:41:21.723 に答える