2016-03-29 9 views
1

Ich entwickle eine GUI in QT, die einige starke Berechnungen basierend auf Benutzereingaben durchführt. Ich mache die ganze Berechnung in einer Funktion sagen start_computation(), wie start_computation() -Funktion aufgerufen wird meine GUI hängt, da es beschäftigt ist, Ausführen von start_computation() -Funktion. Also möchte ich QProgressBar verwenden, um den Benutzer wissen zu lassen, dass die GUI eine Aufgabe im Hintergrund ausführt.

Wie wird QProgressBar in diesem Fall am besten implementiert?wie QProgressBar für schwere Berechnung zu implementieren?

+0

http://stackoverflow.com/questions/32952474/non-blocking-worker-interrupt-file-copy?lq=1 – dtech

Antwort

8

Wenn die ganze komplexe Berechnung durch eine Funktion behandelt wird, kann sie leicht auf den QtConcurrent Rahmen portiert werden werden, so etwas wie die folgenden zu tun, wie im unten genannten tutorial verbunden: entsprechend der künftigen Beendigungsinformationen

QFuture<void> future = QtConcurrent::run(&this->MyObject, &MyClass::LongFunction); 

A FutureWatcher Objekt wird dann den Fortschrittsbalken aktualisieren.

Es ist ein komplettes Beispiel dafür, wie QProgressBar mit QFutures und QtConcurrent im Allgemeinen verwenden hier: https://wiki.qt.io/Progress_Bar

Teilbeendigungsinformationen zu dem Fortschrittsbalken Des Hinzufügen trivial sein, die entsprechenden Informationen unter Verwendung des signals/slot Mechanismus emittiert.

0

Ich weiß nicht, Ihr genaues Szenario aber wenn Ihre Berechnung eine Funktion (start_computation()) ist, können Sie Faden und QThread ist eine gute Lösung verwenden.

In der Tat müssen Sie Ihre Schwer-Berechnung in einen neuen Thread setzen. Dann können Sie den Berechnungsfortschritt vom Hauptthread (GUI) zu bestimmten Zeiten überprüfen und Ihren Fortschrittsbalken aktualisieren.

PS: einige Beispiele sehen QThread in der rechten Weise der Umsetzung, die Sie this SO question und Here beziehen.

0

Der beste Weg, es zu tun ist, Ihre start_computation() Funktion in einen eigenen Thread zu verschieben, dann mit dem signal/slot Mechanismus die GUI korrekt zu aktualisieren. Die GUI muss immer auf dem Haupt-Thread laufen, und eine intensive Funktion wird das immer blockieren.

Es gibt eine gute Diskussion darüber, wie QThreads richtig verwenden hier: http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/

+0

Ich würde sagen, um zu vermeiden, mit 'QThreads' herumzuwühlen, wenn möglich. Es gibt eine nette gleichzeitige API in Qt, die vom QtConcurrent-Modul zur Verfügung gestellt wird, die bei dieser Art von Situation helfen kann. Vor allem, wenn es eine lang laufende Funktion gibt, die die schwere Arbeit erledigt und außerhalb des GUI-Threads ausgeführt werden muss. – alediaferia

+0

Ich vergesse aus irgendeinem Grund immer 'QtConcurrent', aber es ist wahrscheinlich viel passender dafür. –

Verwandte Themen