widget di aggiornamento Qt tardi, ma quando?
-
19-09-2019 - |
Domanda
Mi piacerebbe sapere che cosa succede esattamente quando chiamo il metodo di un QWidget update ().
Ecco la documentazione:
http://doc.qt.digia.com/4.5/qwidget # aggiornamento .html
Questa funzione non causa un riverniciare immediato; invece è pianifica un evento di vernice per l'elaborazione quando Qt ritorna l'evento principale ciclo continuo. Questo permette di ottimizzare per Qt più velocità e meno sfarfallio di un chiamata a ridisegnare () fa.
vedo dal codice sorgente di Qt che viene creato un QUpdateLaterEvent e post con il tipo di QEvent :: UpdateLater
In questa parte della documentazione http://doc.qt.digia.com/4.5/qevent.html
QEvent :: UpdateLater: il widget dovrebbe essere in coda per essere ridipinto in un secondo momento.
Cosa significa 'momento' significa?
Sono i miei tutti i segnali in coda emited e gli eventi nella coda degli eventi elaborati prima che la vernice?
Grazie,
Gabor
Soluzione
Dopo aver controllato QWidget :: update () il codice sorgente ho trovato chiama questo metodo in 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);
}
}
Come si può vedere la QUpdateLaterEvent
viene pubblicato solo se l'aggiornamento () viene già chiamato da all'interno di un metodo paintEvent ().
È inoltre possibile controllare fonte QWidget::repaint(const QRect &rect)
on line 9456 - manca testAttribute(Qt::WA_WState_InPaintEvent)
controllare
Modifica
Il QUpdateLaterEvent
viene registrato come un evento Qt::NormalEventPriority
, in modo che viene elaborato dopo tutti gli altri eventi di priorità normale (vedi src/corelib/kernel/qcoreapplication.cpp:971
e :1003
). Si potrebbe anche voler guardare in codice compressEvent, non ho controllato che.
Quindi, per finalmente rispondere alla domanda:. Il QUpdateLaterEvent viene elaborato dopo altri eventi di alta e normale priorità che erano in coda prima che fosse pubblicato
Altri suggerimenti
comportamento non è documentato == non garantita per rimanere lo stesso tra le versioni di Qt. Si consiglia di non scrivere codice che dipende l'ordine degli eventi vernice rispetto ad altri eventi.