2009-11-13 4 views
5

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

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

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

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

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

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

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

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

+1

Вы можете использовать метод «QWidget :: repaint()» для обеспечения того, чтобы ваш виджет был перекрашен. Или это не вариант для вас? – cybevnm

+0

Нет, это не вариант. Я выделяю очереди в другом потоке, что приводит к обновлению виджета.Я излучаю несколько таких сигналов друг за другом, и я хочу быть уверенным, что сигналы в очереди обрабатываются до обновления и не обновляются несколько раз. – Vereb

ответ

4

После проверки 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

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

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

+0

Спасибо, но я видел эту функцию раньше. Но я хотел бы знать, что происходит с опубликованным событием. Каков приоритет мероприятия? Какие другие события обрабатываются до/после этого события. – Vereb

+0

Как насчет сигналов в очереди, которые были выбраны в другом потоке в основной поток? Сигналы обрабатываются до событий? – Vereb

+0

Документация немного неоднозначна по этому вопросу: не удалось полностью разобраться, попадают ли сигналы в очередь событий отправителя или получателя. –

4

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