QClose Event & QThread
Verfasst: Freitag 20. August 2021, 16:54
Hi Zusammen,
bei folgendem Problem komme ich nicht weiter: Dieses Mainframe hier:
wird durch das Hauptframe meiner Anwendung geöffnet. Also der gezeigte Code ist NICHT das Hauptframe. Jedenfalls wird in diesem Frame ein Thread gestartet, der nach Ablauf einer Zeit eine mp3 (Alarm) abgespielt, aber selbst in einem Loop läuft. Also er kommt selbst nicht zum Ende.:
Mein Problem ist, wenn das oben gezeigte Frame über das X geschlossen wird, dann läuft der Thread munter weiter und wird NICHT geschlossen. Ich hab in der offiziellen Dokumentation nachgeschaut:
https://doc.qt.io/qtforpython-5/PySide2 ... Event.html
und dort das Flag self.setAttribute(Qt.WA_DeleteOnClose) gesetzt, was leider nicht zu dem gewünschten Ergebnis führt, dass AUCH der Thread geschlossen wird, sobald das Frame beendet wird. Probiert habe ich auch, die closeEvent Methode zu überschreiben. Leider ist die Mechanik einen Thread hier mit thread_worker.quit() & wait() zu beenden, eher Fehlerhaft. Erst wenn ich das Hauptframe der gesamten Applikation schließe, ist logischerweise der Thread auch Reif für die Garbage Collection. Ich wünsche mir aber, dass es schon in dem Unterframe geschieht und nicht erst das Signal des Hauptframes nötig ist.
Habt ihr einen Tipp? VIelen Dank
bei folgendem Problem komme ich nicht weiter: Dieses Mainframe hier:
Code: Alles auswählen
class UktvMainframe(QtWidgets.QMainWindow):
def __init__(self, parent=None, logger=None):
super().__init__(parent)
self.error_dialog = QtWidgets.QErrorMessage()
self.logger = logging.getLogger(__name__)
self.ui = uic.loadUi(r"C:\Users\Marc\PYTHON_DEVELOPMENT\PLAYOUT_APPLICATIONS\GUI\uktv_alarmingtool_mainframe.ui", self)
self.setFixedWidth(910)
self.setFixedHeight(755)
self.setAttribute(Qt.WA_DeleteOnClose)
Code: Alles auswählen
self.init_alarm_gen = AG.AlarmGenerator(raw_pts_format_lst, self.ui.alarm_in_sec, self.ui.refresh_data, self.ui.roi_alarms_del)
self.init_alarm_gen.moveToThread(self.worker_alarm_gen)
self.init_alarm_gen.alarm_msg.connect(self.displayAlarmLog) # Contains alarm for ROI
self.init_alarm_gen.CounterChange.connect(self.countChange) # Final Countdown for ROI
self.init_alarm_gen.all_alarms.connect(self.update_all_alarms) # Counter for exported ROI Alamrs
self.init_alarm_gen.auto_refresh_data.connect(self.recall_app) # work done
self.init_alarm_gen.killthread.connect(self.update_killthread_roi)
self.init_alarm_gen.start()
https://doc.qt.io/qtforpython-5/PySide2 ... Event.html
und dort das Flag self.setAttribute(Qt.WA_DeleteOnClose) gesetzt, was leider nicht zu dem gewünschten Ergebnis führt, dass AUCH der Thread geschlossen wird, sobald das Frame beendet wird. Probiert habe ich auch, die closeEvent Methode zu überschreiben. Leider ist die Mechanik einen Thread hier mit thread_worker.quit() & wait() zu beenden, eher Fehlerhaft. Erst wenn ich das Hauptframe der gesamten Applikation schließe, ist logischerweise der Thread auch Reif für die Garbage Collection. Ich wünsche mir aber, dass es schon in dem Unterframe geschieht und nicht erst das Signal des Hauptframes nötig ist.
Code: Alles auswählen
def closeEvent(self,event):
sys.exit() # Es soll nicht alles geschlossen werden, nur der Thread.