2009-11-13 8 views
5

Je voudrais savoir ce qui se passe exactement quand j'appelle la méthode update() de QWidget.
Voici la documentation:Mise à jour du widget Qt plus tard, mais quand?

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

Cette fonction ne provoque pas repeindre immédiatement; au lieu planifie un événement de peinture pour le traitement lorsque Qt revient à l'événement principal boucle. Ceci permet à Qt d'optimiser plus de vitesse et moins de scintillement qu'un appel pour repeindre().

Je vois à partir du code source Qt qu'un QUpdateLaterEvent est créé et afficher avec le type QEvent :: UpdateLater

Dans cette partie de la documentation http://doc.qt.digia.com/4.5/qevent.html

QEvent :: UpdateLater : Le widget doit être mis en file d'attente pour être repeint à ultérieurement.

Que signifie «temps postérieur»?
Mes signaux en file d'attente sont-ils tous émis et les événements de la file d'attente d'événements sont-ils traités avant la peinture?

Merci,
Gabor

+1

Vous pouvez utiliser la méthode "QWidget :: repaint()" pour vous assurer que votre widget sera repeint. Ou ce n'est pas une option pour vous? – cybevnm

+0

Non, ce n'est pas une option. J'émets des signaux en attente dans un autre thread qui entraîne des mises à jour de widget.J'émets plus d'un de ces signaux les uns après les autres et je veux être sûr que les signaux en file d'attente sont traités avant la mise à jour et ne se mettent pas à jour plusieurs fois. – Vereb

Répondre

4

Après vérification QWidget :: update() le code source que j'ai trouvé qu'il appelle cette méthode dans 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); 
    } 
} 

Comme vous pouvez le voir le QUpdateLaterEvent est seulement affiché si la fonction update() est déjà appelée depuis une méthode paintEvent().

Vous pouvez également vérifier QWidget::repaint(const QRect &rect) source sur la ligne 9456 - il manque testAttribute(Qt::WA_WState_InPaintEvent) vérifier.

EDIT

Le QUpdateLaterEvent est affiché comme un événement Qt::NormalEventPriority, il se traité après tous les autres événements de priorité normale (voir src/corelib/kernel/qcoreapplication.cpp:971 et :1003). Vous pourriez aussi vouloir regarder dans le code de compressEvent, je n'ai pas vérifié cela. Donc, pour répondre enfin à la question: le QUpdateLaterEvent est traité après d'autres événements de priorité haute et normale qui étaient dans la file d'attente avant sa publication.

+0

Merci, mais j'ai déjà vu cette fonction auparavant. Mais j'aimerais savoir ce qui se passe avec l'événement affiché. Quelle est la priorité de l'événement? Quels autres événements sont traités avant/après cet événement. – Vereb

+0

Qu'en est-il des signaux en file d'attente qui ont été émis dans un autre thread au thread principal? Les signaux sont-ils traités avant les événements? – Vereb

+0

La documentation est un peu ambiguë à ce sujet: il est impossible de la comprendre si les signaux sont placés dans la file d'attente de l'expéditeur ou du récepteur. –

4

Le comportement n'est pas documenté == n'est pas garanti de rester le même entre les versions Qt. Vous ne devez pas écrire de code qui dépend de l'ordre des événements de peinture par rapport aux autres événements.

Questions connexes