3 Stimmen

QT Fortschrittsdialog Abbruch-Schaltfläche nicht hervorgehoben

Ich habe eine Anwendung, in der 20 verschiedene Klassen verwendet werden. Die Programmausführung beginnt im Hauptfenster. Ich starte einen Fortschrittsdialog. Ich werde verschiedene Klassen für verschiedene Zwecke verwenden. Nach jedem Funktionsaufruf, bei dem die Ausführung in die jeweilige Klasse geht und die erforderliche Aufgabe erledigt und zur Hauptfenster-Klasse zurückkehrt, aktualisiere ich den Fortschrittsdialog. Das Problem ist nun, dass der Fortschrittsdialog einfriert, wenn die Ausführung von der Hauptfenster-Klasse weggeht. Auf die Schaltfläche "Abbrechen" kann nicht zugegriffen werden, so dass die Ausführung nicht zum gewünschten Zeitpunkt beendet werden kann.

mainclass::mainclass() {

ProgressDialog->exec();

x->add();

updateProgressDialog();

y->do();

updateProgressDialog();

zz->bring();

updateProgressDialog();

}

// x, y, z sind drei verschiedene Klassen.

So läuft die Ausführung ab. Sobald ich die Funktion in der Hauptklasse eingebe, starte ich den Fortschrittsdialog. und rufe Funktionen aus verschiedenen Klassen auf. Die Funktionen nehmen viel Zeit in Anspruch. Ich habe einen Thread aufgerufen, um den Ausführungsteil zu erledigen, aber ich bin nicht in der Lage, den Fortschrittsdialog zu beenden. Ich möchte, dass die Programmausführung gestoppt wird, wenn die Schaltfläche "Abbrechen" im Fortschrittsdialog gedrückt wird.

Bitte lassen Sie mich wissen, wie ich dieses Problem lösen kann. Ich hoffe, ich bin hier klar.

1voto

Adam Punkte 2973

Ohne genau zu wissen, welche Berechnungen in Ihren Threads durchgeführt werden, ist es schwierig, das Problem zu isolieren. Vielleicht kann dies helfen: Die GUI reaktionsfähig halten

Auszug aus: Durchführen langer Operationen (von: Witold Wysota)
Während langer Berechnungen (unabhängig von der Verwendung von Signalen und Slots) wird die gesamte Ereignisverarbeitung angehalten. Infolgedessen wird die grafische Benutzeroberfläche nicht aktualisiert, Benutzereingaben werden nicht verarbeitet, die Netzwerkaktivität wird angehalten und Zeitgeber werden nicht ausgelöst - die Anwendung sieht aus, als sei sie eingefroren, und tatsächlich ist der Teil der Anwendung, der nicht mit der zeitintensiven Aufgabe in Verbindung steht, eingefroren.

0voto

Michael Mathews Punkte 382

Die Funktionen, die Sie aufrufen, verarbeiten nicht die Qt-Ereignisschleife. Sie verwenden einen modalen Fortschrittsbalken, da Sie exec() aufrufen. Das bedeutet, dass Qt nur zu den Zeitpunkten die Kontrolle erhält, zu denen Sie den Dialog aktualisieren.

Die einzige Möglichkeit, die ich kenne, um dies zu umgehen, ist der Code des Dialogs als modeless, aber Sie müssen auch eine Gelegenheit für die Ereignisschleife zu verarbeiten.

Dies wird in den Qt-Dokumenten sehr ausführlich erklärt: QProgressDialog

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X