小项目按钮触发的槽函数执行较慢,会阻塞主线程的UI界面,导致卡住,用以下方法可以使按钮的槽函数在线程里面执行
import sys from PySide2.QtCore import QThread, Signal from PySide2.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton import threading class Worker(QThread): signal = Signal() def run(self): # 在这里执行你的槽函数代码 print(f'子线程:{threading.current_thread()}') print("按钮的槽函数在线程中执行") for i in range(1,101): print(i) self.signal.emit() class App(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('PySide2 Thread dome') self.setGeometry(300, 300, 300, 200) layout = QVBoxLayout() # 布局管理器 button = QPushButton('点击我', self) button.clicked.connect(self.on_button_clicked) # 按钮槽函数 layout.addWidget(button) self.setLayout(layout) def on_button_clicked(self): self.worker = Worker() # 实例worker对象 self.worker.signal.connect(self.on_worker_finished) self.worker.start() def on_worker_finished(self): print("线程完成") if __name__ == '__main__': app = QApplication(sys.argv) ex = App() print(f'主线程:{threading.current_thread()}') ex.show() sys.exit(app.exec_())
在这个示例中,我们创建了一个名为Worker
的QThread
子类,并在其中定义了槽函数。当按钮被点击时,on_button_clicked
方法会被调用,然后启动Worker
线程。当线程完成时,它会发出一个信号,该信号连接到on_worker_finished
方法