QT: ListView: dataChanged signal is (per default)fired thousands of times even if no datachanged



  • Hi,

    ich implementiere gerade eine Liste mittels ListView (model/view concept).
    Ich habe wie in der Doku rowCount() und data() Funktionen implementiert.

    Ich hatte dann ein merkwuerdiges Verhalten beobachtet.
    Ich habe an meinem Model etwas geaendert ohne, ein datachanged Signal zu schicken und trotzdem wurde die view geupdatet.

    Ich habe dann in meine ueberschriebene data() Methode eine Konsolenausgabe implementiert um herauszufinden woher er das Wissen kann.

    Es sieht so aus, dass er die data Methode aufruft, (fuer jedes Listenelement 5 Mal 😮 ) sobald ich mit der Mouse ueber die ListView gehe.

    Ein MouseOut triggered auch 5 data Abfragen per Element.
    Noch schlimmer wird das ganze allerdings, wenn ich auf einem Listenelement bin und auf dem selben Element von links nach rechts fahre.

    Das verursacht ueber 200 data() Abfragen.

    Gibt es einen Weg das Verhalten abzuschalten oder zu deaktivieren?



  • Was hat es mit dem dataChanged Signal zu tun?
    Die data Methode ist zum Lesen da. Und die wird tatsächlich ständig aufgerufen, z.B. um den Tooltip abzufragen, oder den Font zum Zeichnen usw. Was stört dich daran oder was willst du überhaupt erreichen?



  • Ok, ich haette gedacht intern wuerde er ein datachanged feuern, dass dann die data() Methode triggert.

    Was mich daran stoert?
    Es ist ineffizient und total unnoetig.
    Er braucht die Daten vom Modell nicht neuholen, wenn sich nichts geaendert hat.

    Ausserdem kann die data() Funktion je nachdem was im Backend passiert ein roundtrip zur Datenbank oder durchs Netzwerk verursachen.

    200 DB roundtrips nur, weil ich mit der Maus von links nach rechts ueber ein bestehendes Element in der Liste fahre kann ja wohl nicht zielfuehrend sein.

    Mein Ziel ist es zwischen 60.000-120.000 Elemente in der Liste performant anzeigen zu koennen. Unter Umstaenden befinden sich noch weitere Elemente in der Datenbank die je nach Bedarf geholt aus der DB geholt werden.

    Ich kann mir solche unnoetigen massiven Updates nicht leisten.
    Kann man dieses Verhalten von der ListView irgendwie abschalten oder blockieren?



  • Ruvi schrieb:

    Es ist ineffizient und total unnoetig.
    Er braucht die Daten vom Modell nicht neuholen, wenn sich nichts geaendert hat.

    Genau dafür ist das Model da. Wo sollte die View die Daten denn sonst herholen? Etwa nochmal alles speichern? Das wäre noch viel ineffizienter.
    Bzw., du darfst das "Model" hier nicht als Model in MVC verstehen. Das ist eher sowas wie ein ViewModel. Also sowas wie eine Hilfsklasse für die View. Wenn du irgendwo irgendwelche Performanceprobleme hast, muss sich dein Model drum kümmern, dafür ist es da.



  • Achso, ich dachte, dass waere wie beim MVC das Model und er wuerde intern auch noch die Daten speichern.

    Ok, dann muss ich noch eine Schicht ziehen, bei mir finden innerhalb des Datenmodels naemlich auch noch String to QString Konvertierung statt.



  • Ruvi schrieb:

    Achso, ich dachte, dass waere wie beim MVC das Model

    Ein "Model" beim MVC bzw. generell das, was man sich drunter vorstellt, soll die Anwendungslogik möglichst gut kapseln. Und das QAbstractItemModel kapselt natürlich gar nichts. Das ist nur ein generischer Adapter für die View Schicht.


Anmelden zum Antworten