Qt4: Fenster aktuallisieren
-
hi
Ich habe das Problem, dass mein Programm Messungen aufnimmt. Dies geschieht fortlaufend mit einer while schleife. Die Ergebnisse sollen direkt angezeigt werden. Es ist aber nichts zu sehen, da das Fenster nicht neu gezeichnet wird.
Gibt es die Möglichkeit, eventuell eine Funktion aufzurufen, die das Fenster aktuallisiert??mfg
-
Wenn die while-Schleife eine Endlos-Schleife ist, hast du ein Problem. Du kommst nämlich nie wieder zurück in die EventLoop, womit auch kein Fenster-Neuzeichnen möglich ist.
Du kannst jetzt versuchen, mittels QApplication::processEvents() einmal pro Durchlauf die Events abzuarbeiten. Richtig dolle ist das aber nicht.
Wenn du ununterbrochen Daten berechnest, solltest du dafür einen eigenen Worker-Thread bauen, der bei einem kompletten Datensatz dein Widget per SIGNAL informiert, damit dieses das grafisch aufarbeiten kann.
Hoffe das hilft dir erstmal weiter.
Grüße
Franz
-
Hi,
vor einpaar Tagen beschäftigte ich mich mit einem ähnlichen Problem.
franz schrieb:
Du kannst jetzt versuchen, mittels QApplication::processEvents() einmal pro Durchlauf die Events abzuarbeiten.
Oder du rufst bei jedem Schleifendurchlauf von der Componente (z. B. QLabel) die repaint()-Methode auf, damit wird dann nur diese eine Komponente neugezeichnet.
Wenn du aber eine andere Anwendung "drüber" schiebst bzw. einfach eine Anwendung öffnest und diese sich über deinen Dialog öffnet, wirst du den schönheitsfehler merken, das wirklich nur z. B. das Label immer richtig gesetzt ist und der Rest mit "weiß" oder sonst wie bleibt.
Beim anwenden von der Möglichkeit von franz kann man darüber fenster öffnen/dein Fenster minimieren/maximieren und verschieben und es wird trotzdem immer richtig dargestellt. Wenn das sehr viele kleine Berechnungen sind, wird dir aber die dadurch schlechtere Performence auffallen.
Ich konnte mit dem Nachteil leben und bei mir hätte es sich auch nicht gelohnt und ich hatte auch die Zeit dafür nicht ein Thread zu schreiben (auch wenn das schöner/sauberer währe!)
franz schrieb:
Richtig dolle ist das aber nicht.
Die Möglichkeit mit repaint() ist auch nicht schöner (eher schlimmer!), aber manchmal sind die richtigen "Wege" nicht die zu realisierenden :(. (besonders wenn man sich erst in das Thema Threads einarbeiten müsste!)
Wie du schon gesagt hast ist die einzige richtige Möglichkeit das über ein Thread zu realisieren.
Gruß
Rudi G
-
Abhängig vom konkreten Anwendungsfall wäre ein QTimer möglicherweise eine Alternative zu Threads. Du lässt den Timer einfach alle 100ms (oder was halt passt) feuern und verbindest das timeout()-Signal mit der Mess-Methode.