举个pyqt5 movetothread例子
时间: 2023-06-29 08:20:23 浏览: 80
QT 5.15.2 move to thread用法示例
好的,这里是一个简单的 PyQt5 的 MoveToThread 的例子:
```python
from PyQt5.QtCore import QThread, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
import sys
class Worker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)
def run(self):
for i in range(100):
self.progress.emit(i)
self.finished.emit()
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 300, 200)
self.setWindowTitle("MoveToThread Example")
self.button = QPushButton("Run", self)
self.button.move(100, 50)
self.button.clicked.connect(self.run)
self.thread = QThread()
self.worker = Worker()
self.worker.moveToThread(self.thread)
self.worker.progress.connect(self.report_progress)
self.worker.finished.connect(self.thread.quit)
self.worker.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
def run(self):
self.button.setEnabled(False)
self.thread.start()
self.worker.run()
def report_progress(self, n):
self.button.setText(str(n))
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec_())
```
这个例子中,我们创建了一个 `Worker` 类来处理一些耗时的任务,然后将其移动到一个单独的线程中运行,从而避免了主线程被阻塞的问题。在主线程中,我们创建了一个 `MyWindow` 类,它包含一个按钮,用于启动任务。当用户点击按钮时,我们启动一个新的线程,并在新线程中运行 `Worker` 类的 `run` 方法。在 `Worker` 类中,我们通过 `pyqtSignal` 定义了两个信号,一个用于报告进度,另一个用于报告任务完成。在 `MyWindow` 类中,我们将 `Worker` 类的实例移动到新线程中,并连接了 `Worker` 类的两个信号,以便在主线程中更新界面。
阅读全文