Обновление виджета Qt позже, но когда? - PullRequest
5 голосов
/ 13 ноября 2009

Я хотел бы знать, что именно происходит, когда я вызываю метод update () QWidget.
Вот документация:

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

Эта функция не вызывает немедленная перекраска; вместо это планирует событие рисования для обработки когда Qt возвращается к главному событию петля. Это позволяет оптимизировать Qt для больше скорости и меньше мерцания, чем вызов для repaint () делает.

Я вижу из исходного кода Qt, что QUpdateLaterEvent создан и отправляет сообщение с типом QEvent :: UpdateLater

В этой части документации http://doc.qt.digia.com/4.5/qevent.html

QEvent :: UpdateLater: виджет следует поставить в очередь, чтобы перекрасить в позже.

Что означает «позднее время»?
Все мои испущенные сигналы в очереди и события в очереди событий обрабатываются до рисования?

Спасибо
Габор

Ответы [ 2 ]

5 голосов
/ 13 ноября 2009

После проверки исходного кода QWidget :: update () я обнаружил, что он вызывает этот метод в src/gui/kernel/qwidget.cpp:9544:

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) проверка.

EDIT

QUpdateLaterEvent публикуется как событие Qt::NormalEventPriority, поэтому оно обрабатывается после всех других событий с обычным приоритетом (см. src/corelib/kernel/qcoreapplication.cpp:971 и :1003). Возможно, вы захотите взглянуть на код compressEvent, я этого не проверял.

Итак, чтобы окончательно ответить на вопрос: QUpdateLaterEvent обрабатывается после других событий с высоким и нормальным приоритетом, которые были в очереди до его публикации.

4 голосов
/ 14 ноября 2009

Поведение не задокументировано == не гарантируется, что он останется неизменным между версиями Qt. Вы не должны писать код, который зависит от порядка событий рисования относительно других событий.

...