【发布时间】:2016-11-10 04:47:37
【问题描述】:
我尝试尽可能多地阅读有关 PyQt4 的 QThread 和工作线程的想法。我的问题是,不是通过blahblah.start() 命令构建一个QThread 类来从def run(self): 运行其中的所有内容,而是有一种方法可以创建具有例如4 个函数并且您只调用函数2 和然后立即关闭该线程?
【问题讨论】:
我尝试尽可能多地阅读有关 PyQt4 的 QThread 和工作线程的想法。我的问题是,不是通过blahblah.start() 命令构建一个QThread 类来从def run(self): 运行其中的所有内容,而是有一种方法可以创建具有例如4 个函数并且您只调用函数2 和然后立即关闭该线程?
【问题讨论】:
子类化 [见下方评论]QThread 是一种通常是discouraged 的做法,尽管经常使用。
在我看来,this 是如何在 pyqt 中使用线程的一个很好的例子。您将创建一个 Worker 和一个 Thread,其中 Worker 是 QObject 类型的某个通用类,而 Thread 是您没有子类化的 QThread。然后将 Worker 移至 Threat 并启动它。
self.worker = WorkerObject()
self.worker_thread = QtCore.QThread()
self.worker.moveToThread(self.worker_thread)
self.worker_thread.start()
在 Worker 内部你基本上可以做任何你想做的事情,它可以有任意多个方法等等。
要记住的一件大事是 Worker 需要与主循环分开。所以这些方法不应该返回任何在主循环中使用的东西(最好不要返回任何东西),并且应该使用信号和槽来收集 Worker 的结果。
self.button_start.clicked.connect(self.worker.startWork)
self.button_do_something_else.clicked.connect(self.worker.function2)
self.worker.signalStatus.connect(self.updateStatus)
还要确保不要在 worker 内部使用任何 PyQt/GUI 对象,因为这也会通过 PyQt 本身在 Worker 和主循环之间建立一座桥梁。
【讨论】:
QThread。当前的Qt documentation 使用这两种方法。您链接到的博客文章现在已经过时,因为它引用了一些现在已经重写的旧文档。有关详细信息,请参阅this blog post。