2020from AnyQt .QtCore import Qt , QSize , QThread
2121from AnyQt .QtCore import pyqtSlot as Slot
2222from AnyQt .QtGui import QStandardItem , QDoubleValidator
23- from AnyQt .QtWidgets import QHeaderView , QTableWidget , QLabel
23+ from AnyQt .QtWidgets import QHeaderView , QTableWidget , QLabel , QApplication
2424
2525from Orange .base import Learner
2626import Orange .classification
@@ -1085,6 +1085,8 @@ def cancel(self):
10851085 task .cancel ()
10861086 task .progress_changed .disconnect (self .setProgressValue )
10871087 task .watcher .finished .disconnect (self .__task_complete )
1088+ add_task_to_dispose_queue (task )
1089+
10881090 self .progressBarFinished ()
10891091 self .setStatusMessage ("" )
10901092
@@ -1094,6 +1096,15 @@ def onDeleteWidget(self):
10941096 super ().onDeleteWidget ()
10951097
10961098
1099+ def add_task_to_dispose_queue (task : TaskState ):
1100+ # transfer ownership of task to Qt, and delete it after completion
1101+ # all other signals from task should be disconnected.
1102+ assert task .parent () is None
1103+ app = QApplication .instance ()
1104+ task .setParent (app )
1105+ task .watcher .finished .connect (task .deleteLater )
1106+
1107+
10971108class UserInterrupt (BaseException ):
10981109 """
10991110 A BaseException subclass used for cooperative task/thread cancellation
0 commit comments