Mit Qt4.8 auf einem Mint Linux 12, implementierte ich ein einfaches Fenster mit einem QTableView
, um den Inhalt eines Modells anzuzeigen. Die Modelldaten werden kontinuierlich aktualisiert (Protokollnachrichten) und das Signal dataChanged()
wird regelmäßig ausgegeben (d. H. Alle 100 ms).QWidget Update-Ereignisse, aber keine visuelle Aktualisierung
Das Problem, das ich sehe, ist stotternde visuelle Updates auf dem Tisch.
Ich habe einen Ereignisfilter im Fenster installiert, der updateRequest
- Typ Ereignisse zählt, die ein Widget Repaint (auch auf Kind Widgets, d. H. Die tableView
) auslösen sollte. Diese kommen mit einer durchschnittlichen Zeit von ~ 170ms dazwischen und einer Standardabweichung von ~ 90ms (was ziemlich groß ist, denke ich). Allerdings ist die wahrgenommene visuelle Update-Rate nur zwei oder drei Mal pro Sekunde und ich frage mich warum. Es scheint, dass nicht alle updateRequest
Ereignisse ein Widget-Repaint auslösen oder dass das Fenstersystem visuelle Updates verschluckt.
Als ein zweiter Test, zwang ich das Fenster, sich selbst zu aktualisieren, indem alle 100ms repaint
oder update
aufrufen. Unter Verwendung von repaint
sah ich eine entsprechende Zunahme der Ereignisse vom Typ updateRequest
und eine Abnahme der Standardabweichung der Lücken; mit update
stieg die Anzahl nicht. In beiden Fällen gab es jedoch nur einen moderaten Anstieg der wahrgenommenen Aktualisierungsrate.
Auch: Gibt es eine gute Methode um zu messen, wie oft ein Widget wirklich neu gestrichen wird, ohne seinen paintEvent
Handler überladen zu müssen? Vielleicht etwas von QTest
?
Update: ich meine Ereignisfilter erweitert auch Ereignisse paintEvent
-Typ zu fangen. Es gibt nur eine einstellige Anzahl von Ereignissen im Vergleich zu> 1000 updateRequest
-Typ-Ereignissen.
Gute Idee! Ich habe derzeit einen engen Zeitplan für das Projekt, daher wird es ein paar Tage dauern, um das zu testen. Ich denke, das sollte mir einen guten Überblick über die Last geben, aber ich habe tatsächlich die updateRequest-Ereignisse gezählt, die mein Widget erreichen, und diese kommen viel näher (im Durchschnitt, Verstand) als die wahrgenommene Aktualisierungsrate. – arne
Das Zählen ist in Ordnung, aber es sagt nichts über das zugrunde liegende Problem aus.Es sagt nur, es gibt ein Problem, und nun, Sie können es offensichtlich bemerken, ohne eine einzige Zeile Code zu schreiben :) –