Pyside6 多线程有三种方法:计时器模块 QTimer
、多线程模块 QThread
、事件处理。这里我们介绍QThread
用法。
QThread
QThread
是Qt
所有线程控制的基础,每个 QThread 实例代表一个线程。
QThread 有两种使用方式,即子类化和实例化。
-
子类化需要重写
run()
函数并在该函数中执行多线程操作; -
实例化需要通过 QObject.moveToThread(targetThread:QThread) 函数接管多线程类
1. 子类化
【后续补充】
2. 实例化(推荐)
在 PySide6 中,QThread
和 moveToThread
的用法与 Qt 框架中的使用方法基本相同。QThread
是 PySide6 中的线程类,而 moveToThread
是将一个对象移动到特定线程的方法。
以下是在 PySide6 中使用 QThread
和 moveToThread
的详细步骤:
1. 导入必要的模块:
在 Python 脚本的开头,导入需要的 PySide6 模块:
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide6.QtCore import QThread, Slot, Signal
import sys
2. 创建自定义对象:
首先,创建你想要移动到线程的自定义对象。这个对象应该继承自 QObject
,并包含你想要在另一个线程中执行的方法。
from PySide6.QtCore import QObject, QEventLoop
class Worker(QObject):
def __init__(self):
super().__init__()
def do_work(self):
# 在这里执行你的耗时任务
loop = QEventLoop()
loop.exec_()
3. 创建线程:
然后,创建一个 QThread
对象,代表你要在其中执行任务的目标线程。
thread = QThread()
4. 创建自定义对象实例:
实例化刚刚创建的自定义对象。
worker = Worker()
5. 将对象移动到线程:
使用 moveToThread
方法将对象移动到目标线程。
worker.moveToThread(thread)
6. 连接线程的启动信号:
确保在目标线程启动时,你的对象也会启动。可以使用连接(connect)机制来完成这一点。
thread.started.connect(worker.do_work)
7. 启动线程:
最后,启动目标线程。
thread.start()
完整的示例代码如下:
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
from PySide6.QtCore import QThread, Slot, Signal, QEventLoop
import sys
class Worker(QObject):
def __init__(self):
super().__init__()
def do_work(self):
# 在这里执行你的耗时任务
loop = QEventLoop()
loop.exec_()
app = QApplication(sys.argv)
# 创建线程
thread = QThread()
# 创建要移动的对象
worker = Worker()
# 将对象移动到线程
worker.moveToThread(thread)
# 连接线程的启动信号
thread.started.connect(worker.do_work)
# 链接线程结束的信号
thread.finished.connect(worker.quit)
thread.finished.connect(worker.deleteLater)
# 启动线程
thread.start()
sys.exit(app.exec_())
这样,Worker
对象的 do_work
方法将在 thread
线程中执行。这样做可以避免在主线程中执行耗时的操作,使得主线程保持响应性。请确保在完成任务后正确地退出线程,并释放资源。
通过 finished
信号连接到 QObject.deleteLater()
函数来释放刚刚结束的线程中的对象。如果要终止线程,则可以使用函数 exit()
或 quit()
。强制结束的话可以使用 terminate()
函数来终止正在运行的线程,同时要确保在 terminate()
函数之后使用 wait()
函数。
信号 | 描述 |
---|---|
started | 在开始执行 run() 函数之前,从相关线程发射此信号 |
finished | 党程序完成业务逻辑时,从相关线程发射此信号 |