gpt4 book ai didi

python - 在 QTimer Singleshot 之后终止 QThread

转载 作者:行者123 更新时间:2023-12-01 06:53:46 28 4
gpt4 key购买 nike

我有一个问题。我正在运行一个 PyQt5 表单,它运行一个名为 Task() 的工作程序(我不会详细介绍其代码,但它基本上只是将一个值返回到 QLabel code>) 在 QThread 中,如下所示:

class Menu(QMainWindow):
def __init__(self, workers):
super().__init__()
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
lay = QVBoxLayout(self.central_widget)
self.setFixedSize(500, 350)
Pic = QLabel(self)
self.Total = QLabel("Total: <font color='orange'>%s</font>" % (to_check()), alignment=QtCore.Qt.AlignHCenter)
lay.addWidget(self.Total)
thread = QtCore.QThread(self)
thread.start()
self.worker = Task()
self.worker.moveToThread(thread)
self.worker.totalChanged.connect(self.updateTotal)
QtCore.QTimer.singleShot(0, self.worker.dostuff)
thread.finished.connect(self.terminate)


@QtCore.pyqtSlot(int)
def updateTotal(self, total):
self.Total.setText("Total: <font color='orange'>%s</font>" % (total))

def terminate(self):
print("FINISHED")
self.worker.quit()
self.worker.wait()
self.close()

我希望程序在 Task().dostuff() 函数执行后调用 terminate 插槽(基本上终止线程和函数)已完成 - 但我似乎无法使其工作。

我不知道如何通过QTimer.singleshot返回主函数。

最佳答案

不需要计时器。使用线程的 started 信号来启动工作线程,并在工作线程类中添加一个 finished 信号来退出线程:

class Task(QtCore.QObject):
totalChanged = QtCore.pyqtSignal(int)
finished = QtCore.pyqtSignal()

def dostuff(self):
# do stuff ...
self.finished.emit()

class Menu(QtWidgets.QMainWindow):
def __init__(self, workers):
super().__init__()
...
self.thread = QtCore.QThread()
self.worker = Task()
self.worker.moveToThread(self.thread)
self.worker.totalChanged.connect(self.updateTotal)
self.worker.finished.connect(self.thread.quit)
self.thread.started.connect(self.worker.dostuff)
self.thread.start()

关于python - 在 QTimer Singleshot 之后终止 QThread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58893344/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com