写一个pyqt5的子线程传输信号给主进程的案例
时间: 2024-02-05 14:12:58 浏览: 111
好的,以下是一个简单的案例:
```python
import sys
import time
from PyQt5.QtCore import pyqtSignal, QObject, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
class Worker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)
def run(self):
for i in range(101):
time.sleep(0.1)
self.progress.emit(i)
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('PyQt5 Example')
self.setGeometry(100, 100, 300, 200)
self.label = QLabel('Progress: 0%', self)
self.label.setGeometry(20, 20, 200, 50)
self.thread = QThread()
self.worker = Worker()
self.worker.moveToThread(self.thread)
self.worker.progress.connect(self.update_progress)
self.worker.finished.connect(self.thread.quit)
self.thread.started.connect(self.worker.run)
self.thread.finished.connect(self.worker.deleteLater)
self.thread.finished.connect(self.thread.deleteLater)
def update_progress(self, value):
self.label.setText(f'Progress: {value}%')
def start(self):
self.thread.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
window.start()
sys.exit(app.exec_())
```
在这个案例中,我们定义了一个 `Worker` 类,它继承自 `QObject` 并且在其中定义了两个信号: `finished` 和 `progress`。`run` 方法会在子线程中执行,它会每 0.1 秒发送一个 `progress` 信号,表示当前进度,直到完成后发送一个 `finished` 信号。
在主窗口中,我们定义了一个 `QLabel` 控件用于显示进度,并创建了一个子线程和一个 `Worker` 实例。我们将 `Worker` 实例移动到子线程中,并连接了它的两个信号和子线程的 `started` 和 `finished` 信号。我们还定义了一个 `update_progress` 方法用于更新进度条的显示。
最后,在 `start` 方法中,我们启动了子线程。
运行程序后,你会看到一个带有进度条的窗口,进度条会在子线程中不断更新。
阅读全文