1
我想通过模态QDialog
显示加载进度。所以我创建一个线程来加载数据并在对话框中调用exec()
。PyQt对话框在线程运行时不负责
loading_progress_dialog = LoadingProgressDialog(len(filenames))
loadingWorker = analyzer.LoadingWorker(filenames, loading_progress_dialog.apply_progress)
workingThread = QThread()
workingThread.started.connect(loadingWorker.process)
loadingWorker.finished.connect(workingThread.quit)
workingThread.finished.connect(loading_progress_dialog.accept)
loadingWorker.moveToThread(workingThread)
workingThread.start()
loading_progress_dialog.exec()
我想对话框来负责,但它冻结,我无法加载线程运行时,它周围在屏幕上移动。
class LoadingProgressDialog(QLoadingProgressDialog, Ui_LoadingDialog):
def __init__(self, maxFiles):
super(LoadingProgressDialog, self).__init__()
self.setupUi(self)
self.progressBar.setMaximum(maxFiles)
self.setWindowTitle('Loading files...')
def apply_progress(self, delta_progress):
self.progressBar.setValue(delta_progress + self.progressBar.value())
class LoadingWorker(QtCore.QObject):
def __init__(self, file_names, progress_made):
super(LoadingWorker, self).__init__()
self._file_names = file_names
self._progress_made = progress_made
finished = QtCore.pyqtSignal()
def process(self):
print("Thread started")
# load_csv_data(self._file_names, self._progress_made)
QtCore.QThread.sleep(5)
self.finished.emit()
我与GIL战斗还是另一个问题?我担心的第二件事情是self.finished.emit()
和loading_progress_dialog.exec()
之间的竞赛状况。如果工作线程完成得比gui线程运行速度快exec()
,对话框将不会关闭。有什么方法可以确保一切顺序正确吗?
为什么你需要连接信号之前,移动到线程的讨论可以找到[这里](http://stackoverflow.com/q/20752154/1994235)。如果你用'@ pyqtSlot'装饰插槽,那么在连接之前你不需要移动。 –