Ich habe gerade etwas QThread-basierten Code geschrieben, der eine große Berechnung ausführt. Um den Fortschritt zu visualisieren, muss ich einen QProgressDialog öffnen. Der Dialog ist anwendungsmodal (mit open()), da ich während der Berechnung keine Änderungen am Hauptfenster zulassen möchte. Der Thread gibt verschiedene Signale aus, die eine zustandsbasierte Kommunikation zwischen GUI und Thread ermöglichen.Modal QProgressDialog :: setValue() verursacht Absturz durch geschachtelte Ereignisschleife
Zwei der vom Worker-Objekt des Threads ausgegebenen Signale sind "Progress" und "Finished". Wenn "Progress" ausgegeben wird, aktualisiere ich den QProgressDialog mit setValue(). Wenn "Fertig" ausgegeben wird, wird der Dialog zerstört.
passiert Folgendes am Ende der Berechnung:
- "Progress" Ereignis (100%) emittiert wird
- "Finished" ausgesendet wird direkt nach
- setValue (100) aufgerufen wird aufgrund "Progress" Ereignis
- Da der Dialog modal ist, setValue() ruft process()
- process() tritt die "Finished" -Ereignis
- Das „Fertig“ Ereignis bewirkt, dass der Dialog in der Mitte von setValue zerstört werden(), die einen Absturz verursacht
QProgressDialog bricht meine Architektur von process() in setValue() aufgerufen wird. Auch meine Codierungskonventionen verbieten die Verwendung verschachtelter Ereignisschleifen (wie in exec() usw.).
Ich habe zwei Fragen:
Warum bedarf es ein modaler Dialog eine verschachtelte Ereignisschleife? Von meinem unerreichbaren Blockieren scheint die Eingabe der Elternfenster dies nicht zu erfordern.
Ist es möglich, QProgressDialog auf eine modale Weise, aber ohne verschachtelte Ereignisschleife zu verwenden?
Wie "zerstöre" der dialog? verwendest du 'deleteLater()'? – Mike
Ihr Fragentitel stimmt nicht mit Ihren tatsächlich nummerierten Fragen überein. Bitte mach, dass sie gleich sind. – xaxxon
@Mike: Ich benutze löschen. Vielleicht ist deleteLater ein Workaround, ich werde das so schnell wie möglich versuchen. – Silicomancer