2009-11-13 17 views
5

Me gustaría saber qué sucede exactamente cuando llamo a un método QWidget's update().
Aquí está la documentación:Actualización del widget Qt más tarde, pero ¿cuándo?

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

Esta función no causa un repinte inmediata; en su lugar programa un evento de pintura para procesar cuando Qt vuelve al evento principal loop. Esto permite que Qt optimice para más velocidad y menos parpadeo que una llamada a para volver a pintar().

que ver desde el código fuente de Qt que se ha creado y puesto con el tipo QEvent :: UpdateLater

En esta parte de la documentación de un QUpdateLaterEvent http://doc.qt.digia.com/4.5/qevent.html

QEvent :: UpdateLater : El widget se debe poner en cola para volver a pintar en más tarde.

¿Qué significa 'later time'?
¿Se procesan todas mis señales en cola emitidas y los eventos en la cola de eventos antes de la pintura?

Gracias,
Gabor

+1

Puede utilizar el método "QWidget :: repaint()" para asegurarse de que su artilugio se volverá a pintar. ¿O esta no es una opción para ti? – cybevnm

+0

No, esta no es una opción. Emito señales en cola en otro hilo que da como resultado actualizaciones de widget.Emito más de una señal de este tipo una tras otra y quiero asegurarme de que las señales en cola se procesen antes de la actualización y no se actualicen varias veces. – Vereb

Respuesta

4

Después de comprobar QWidget :: update() el código fuente que he encontrado que llama a este método en 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); 
    } 
} 

Como se puede ver la QUpdateLaterEvent sólo es publicado si la actualización() ya se llama desde dentro de un método paintEvent().

También puede marcar QWidget::repaint(const QRect &rect) fuente en la línea 9456 - carece de testAttribute(Qt::WA_WState_InPaintEvent) verificar.

EDITAR

El QUpdateLaterEvent se publica como un evento Qt::NormalEventPriority, por lo que se procesa después de todos los demás eventos normales de prioridad (ver src/corelib/kernel/qcoreapplication.cpp:971 y :1003). También es posible que desee examinar el código compressEvent, no lo he comprobado.

Para finalmente responder a la pregunta: el QUpdateLaterEvent se procesa después de otros eventos de prioridad alta y normal que estaban en cola antes de su publicación.

+0

Gracias, pero he visto esta función antes. Pero me gustaría saber qué sucede con el evento publicado. ¿Cuál es la prioridad del evento? Qué otros eventos se procesan antes/después de este evento. – Vereb

+0

¿Qué pasa con las señales en cola que se emitieron en otro hilo al hilo principal? ¿Las señales son procesadas antes de los eventos? – Vereb

+0

La documentación es un poco ambigua en esto: no podría entenderse si las señales están en cola en el bucle de eventos del remitente o del receptor. –

4

El comportamiento no está documentado == no se garantiza que se mantenga igual entre las versiones de Qt. No debe escribir código que depende del orden de los eventos de pintura en relación con otros eventos.

Cuestiones relacionadas