QWidget::paintEvent
ウィジェットが表示されるか、基本ウィンドウからのイベントが発生した瞬間に自動的にトリガーされることが知られています。paintEvent
に対してのみを発行してもらいたい場合はどうすればよいupdate()
ですか?
1 に答える
paintEvent
ウィジェットを描画する必要があるときに を発行しないのは意味がありません。そのようなオプションを要求する理由は、意図されていない方法で Qt API を使用しようとしていることを意味します。申し訳ありませんが、そのような使用につながるような特定のデザインはまだ想像できません。
だから、私があなたに言える唯一のことは、あなたがどのように使うかということですupdate()
. ウィジェットの更新を処理する慣用的な方法は次のとおりです。
ウィジェットが使用するデータのソースが更新されます。たとえば、表示されるコンテンツに影響を与えるテキストまたは変数が変更されます。多くの場合、このデータはウィジェットの Q_PROPERTY です。セッター関数は、値を格納して を呼び出すメンバー変数を更新しています
update()
。セッターは高価な計算を実行すべきではありません - それらは描画イベントまで延期されるべきです。イベント ループが実行される前にプロパティが複数回変更されると、更新イベントが結合されます。内部的には、 を呼び出すと
update()
、GUI スレッドのイベント キューにイベントがポストされます。特定のウィジェットのキューに更新イベントが既に存在する場合、イベントは結合されます。次の不変条件が保持されます。常に、イベント キュー内の特定のウィジェットに対して 1 つの更新イベントしか存在できません。コントロールがイベント ループに戻ると、更新イベントがウィジェットにディスパッチされ、最終的に の再実装が呼び出されます
QWidget::paintEvent(...)
。この実装は、ウィジェットの描画に必要な計算を行い、実際の描画を行う必要があります。計算が広範囲に及ぶ場合は、ワーカー スレッドに委譲する必要があります。
例
QIODevice
アプリケーションが(aQSerialPort
は 1)としてモデル化されたシリアル ポートからデータを受信しているとします。次のように実行できます。
QIODevice
のreadyRead
信号をパーサーのスロットに接続しますQObject
。スロットはデータを受信して解析します。次に、処理されたデータ (浮動小数点値のベクトルなど) を含む信号を送信します。この信号は
newData
、ウィジェットのスロットに接続されています。newData
スロットはデータをそのままキューに追加し、update()
. Qt のデータ構造を使用している場合、またはデータ クラスがそれらに基づいてモデル化されており、コピー オン ライトによる暗黙的な共有を使用している場合、これは非常に高速です。は
update()
、すべてのデータ セットをデキューし、それらをプロットします。このQWidget::scroll()
メソッドは、プロットをスクロールするのに便利です。