Qt: Widget-Inhalt wird verzögert dargestellt



  • Ich habe gerade gegen ein recht hartnäckiges Problem zu kämpfen und leider gehen mir die Ideen aus, was ich noch versuchen könnte: Ich habe ein kleines Programm, das mit zunehmender Nutzungsdauer langsamer zu werden scheint. Das stellt sich folgendermaßen dar:
    Wenn ich ein Fenster im Programm erstelle und es per exec() ausführe, erscheint der Inhalt nur mit Verzögerung (bei show() scheint das Problem nicht zu bestehen). Ich sehe zuerst nur den Rahmen des Fensters, der Inhalt ist einfach durchsichtig. Eventuell im Fenster vorhandene Default-Buttons ziehen schon meinen Mauszeiger an (der springt automatisch auf Default-Buttons in jedem Fenster), obwohl ich die Buttons noch gar nicht sehen kann - scheinbar ist also nur die grafische Darstellung des Fensters verzögert, der Inhalt befindet sich schon an den richtigen Positionen.
    Verwende ich das Programm möglichst intensiv (einfach nur warten bewirkt nichts), steigt diese Verzögerung an.

    Ich habe schon ein paar mögliche Fehlerquellen untersucht und mich mit dem Event-Stack beschäftigt, aber das gleicht bisher der Suche nach der Nadel im Heuhaufen. Eventuell kennt ja jemand das Problem und kann mir helfen.



  • Ich habe ein kleines Programm

    Dann poste doch mal Code. Ich kenne so ein Verhalten nicht. Mit relativ hoher Wahrscheinlichkeit liegt der Fehler bei dir.

    Wenn es wirklich klein ist, kannst du ja alles in ein .zip packen und wo hochladen, dass man sich das mal anschauen kann. Ansonsten vllt. die Dialog-Klasse (samt Implementierung der Methoden) und exemplarisch wie der Dialog gestartet wird.



  • Klein trifft es nicht ganz, da weiß ich nicht, welchen Code ich posten soll - ich weiß immerhin auch nicht, wo ich nach dem Fehler suchen müsste.
    Ich weiß nur, dass beim jedem Aufruf von exec() eines Dialogs (ich habe fünf oder sechs verschiedene getestet und hatte solche Probleme auch vorher noch nie) diese verzögerte Darstellung auftritt. Allerdings eben nur, wenn das Programm schon eine Weile benutzt wird.
    Ich habe versucht, mal QApplication::setAttribute(Qt::AA_ImmediateWidgetCreation , true) auszuführen, allerdings nur mit dem Erfolg, dass das Problem auch beim Aufruf von show() auftritt, anstatt nur bei exec().

    Dass der Fehler bei mir liegt, hoffe ich doch, denn im Qt-Code könnte ich nicht danach suchen. Aber mir ist das Problem eben völlig neu und ich weiß einfach nicht, wo ich den Fehler eingebaut haben könnte.

    Ich wühle weiter in der Qt-Dokumentation und probiere, hilft ja nichts :(.

    PS: Mir wäre auch mit Tipps sehr geholfen, wie ich denn dem Problem auf die Spur kommen könnte. Ich habe schon ein paar Zeiten gemessen, Funktionen geleert und noch mehr, um einen Anhaltspunkt auf den Ursprung für die Verzögerungen zu finden. Bisher war das jedoch alles vergebens.
    Übrigens bin ich ziemlich sicher, dass das Problem etwas mit meinem Hauptfenster zu tun hat. Kann es sein, dass ich unbewusst Events auslöse oder irgendwelche Dinge tue, die ein exec() im Gegensatz zu einem show() verzögern könnten? Welche Dinge könnten das sein?

    Nachtrag:
    Ich vermute jetzt, dass das Problem von einem Layout im Hauptfenster herrührt. Dort habe ich ein Layout, das ich häufig leere und mit neuen Widgets bestücke. Wenn ich diesen Prozess ca. 100 mal durchführe, sind die Verzögerungen beim Öffnen von Fenstern deutlich spürbar. Wenn ich das ganze 200 mal mache, ist die Verzögerung gefühlt doppelt so lang.
    Jetzt kann ich auch endlich ein wenig Code posten:

    QLayoutItem * child;
    while((child = Layout->takeAt(0)) != NULL)
    		delete child;//Layout wird geleert
    //...//
    for(i = 0 ; i < 4 ; i ++)
    	Layout->addWidget(widgetListe.at(i) , 1 , Qt::AlignJustify);//neue Widgets werden zugefügt
    

    Bei den Widgets handelt es sich um leicht modifizierte Label, die über ein zusätzliches Attribut (einen QString) und ein Signal verfügen, das an einen Slot im Hauptfenster gebunden wird (für jedes einzelne Label). Außerdem ist das mouseReleaseEvent reimplementiert.

    Muss ich zum vollständigen Leeren des Layouts mehr tun, als nur "delete child" aufzurufen? Oder muss ich beim Zufügen etwas beachten, das ich momentan übersehe?


Anmelden zum Antworten