1

アプリケーションの時間を計って、情報を読み込んでグラフを描画するのにかかる時間を調べようとしています。私の関数は、最初にデータをロードしてから、グラフを描画します。

タイミングはかなり単純で、ある日付からのミリ秒を取得する外部関数を呼び出します。問題は、最初に t1 を設定し、描画関数を呼び出した直後に t2 を設定しても、QGraphicsView が実際に更新される前に t2 が返されることです。(私は知っています、なぜこれが非同期であるべきかは理にかなっています)

たとえば、大きなファイルをロードすると、2 つの値を差し引いた後 700 ミリ秒で返されますが、実際のレンダリングは数秒後まで終了しません。

私はWeb全体を調べ、Qtのドキュメントを精査しました。ウィジェットを自分で更新する方法に関する情報は山ほどありますが、レンダリングの終了後に発生するシグナルやイベントに関する情報はありません。

レンダリングが完了してユーザーが変更を確認できるときではなく、下のQGraphicsScene::changedシーンが変更されたときにのみ信号が発生するように見えます。

これを行う方法について何か助けはありますか?

4

2 に答える 2

0

QGraphicsView または QWidget の描画またはレンダリングが完了したときのシグナルまたはイベントは存在しますか?

私の知る限り、それは存在しません。(似たようなものを探しました)

ユーザーは変更を確認できます

私の知る限り、Qt はダブル バッファリングを使用しているため、描画が終了してもユーザーが変更を確認できるわけではありません。

これを行う方法について何か助けはありますか?

塗装がいつ終了したか知りたい場合は...

  1. QGraphicsScene をサブクラス化し、独自の drawItems、drawBackground、または drawForeground を実装できます。これは単純ではありませんが (アイテムのペイント アルゴリズムが複雑なため)、すべてのアイテムのペイントがいつ終了したかを知ることができます。
  2. paintEvent( -QWidgetベースのクラス) または paint() ( QGraphicsItem/ -ベースのクラス)内からシグナルを発火/放出できますQGraphicsObject。明らかに、独自のクラスを使用する必要があり、QGraphicsView、またはビュー内で描画しているアイテム、または QGraphicsScene のいずれかをサブクラス化する必要があります。
  3. プロキシ QPainter クラスを作成することもできます。これにより、正確に何がいつペイントされているかを知ることができます。

私はあなたがあなたの問題に間違って近づいているのではないかと思っています。

  1. グラフを描こうとしているだけなら、描画がいつ終了したかを知る必要はありません。
  2. ペイントが完了しても、ユーザーが結果を見ることができるわけではありません。
  3. Paint イベントは複数回呼び出される場合があります。

推奨されるアプローチ:

スレッドまたはタイマーイベントを使用して外部ソースからデータ(グラフに描画している)を受信/読み取り(タイマーイベントを使用している場合は、明らかに小さなチャンクで読み取る必要があります)、時間からグラフを更新します時間に合わせて、Qt に再描画を処理させます。


これにより、ファイルを開くことを選択してから、すべてのデータが読み込まれ、グラフが描画されて表示されるまでにかかる時間を正確に検出できますか?

  1. グラフの描画に使用しているウィジェットをサブクラス化し、paintEvent をオーバーライドし、paintEvent 内から信号を発火させ、サブルーチンを呼び出すか、必要なことを行うことで、paintEvent が描画を終了したことを検出できます。
  2. paintEvent が 1 回だけ呼び出されるという保証はありません。
  3. 個々のルーチンの速度を測定し、ボトルネックを特定するには、プロファイラーを使用します。VerySleepy、AQTime など。
  4. データの読み込みと表示にかかる時間を測定する代わりに、読み込み時間と表示時間を別々に測定する方がはるかに理にかなっています。これはゲーム エンジンではなく GUI アプリケーションであるため、何かが描画されているタイミングを正確に制御することはできません。
于 2013-07-03T13:40:00.713 に答える