6

QWidget の update() メソッドを呼び出すと正確に何が起こるか知りたいです。
ドキュメントは次のとおりです。

http://doc.qt.digia.com/4.5/qwidget.html#update

この関数は、即時の再描画を引き起こしません。代わりに、Qt がメイン イベント ループに戻ったときに処理するペイント イベントをスケジュールします。これにより、Qt は repaint() の呼び出しよりも高速でちらつきが少ないように最適化できます。

QUpdateLaterEvent が作成され、タイプQEvent::UpdateLaterで投稿されていることが Qt ソース コードからわかります。

ドキュメントのこの部分 http://doc.qt.digia.com/4.5/qevent.html

QEvent::UpdateLater: 後で再描画するために、ウィジェットをキューに入れる必要があります。

「後で」とはどういう意味ですか?
発行されたすべてのキュー シグナルとイベント キュー内のイベントは、ペイントの前に処理されますか?

ありがとう、
ガボール

4

2 に答える 2

6

src/gui/kernel/qwidget.cpp:9544QWidget::update() ソース コードを確認した後、次のメソッドを呼び出していることがわかりました。

void QWidget::update(const QRect &rect)
{
    if (!isVisible() || !updatesEnabled() || rect.isEmpty())
        return;

    if (testAttribute(Qt::WA_WState_InPaintEvent)) {
        QApplication::postEvent(this, new QUpdateLaterEvent(rect));
        return;
    }

    if (hasBackingStoreSupport()) {
        QTLWExtra *tlwExtra = window()->d_func()->maybeTopData();
        if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
            tlwExtra->backingStore->markDirty(rect, this);
    } else {
        d_func()->repaint_sys(rect);
    }
}

ご覧のとおりQUpdateLaterEvent、 update() が paintEvent() メソッド内から既に呼び出されている場合にのみ投稿されます。

QWidget::repaint(const QRect &rect)9456 行でソースを確認することもできます。これにはtestAttribute(Qt::WA_WState_InPaintEvent)チェックがありません。

編集

はイベントQUpdateLaterEventとしてポストされるQt::NormalEventPriorityため、他のすべての通常優先度イベントの後に処理されます (src/corelib/kernel/qcoreapplication.cpp:971およびを参照:1003)。また、compressEventコードを調べたいと思うかもしれませんが、私はそれをチェックしていません。

最終的に質問に答えるために: QUpdateLaterEvent は、ポストされる前にキューにあった他の優先度の高いイベントと通常のイベントの後に処理されます。

于 2009-11-13T12:50:20.440 に答える
4

動作は文書化されていません == Qt バージョン間で同じままであるとは限りません。他のイベントに対するペイント イベントの順序に依存するコードを記述しないでください。

于 2009-11-13T21:49:07.087 に答える