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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top