概述:
在项目 中我们常遇到,大量计算或者加载数据时,需要用到多线程,此时只能等待,我们这个时间需要添加一下进度条,告诉用户当前需要等待,这时间就需要用到多线程和等待进度条;
效果:
1.实现原理:
代码使用了PyQt5库创建了一个简单的窗口应用程序,其中包含一个进程条控件于显示进度信息。在后台使用QThread类创建了一个工作线程,模拟耗时操作,并通过信号progressUpdated将进度更新发送给主线程。
2.主要的类和功能如下:
Worker类是一个自定义的线程类,继承自QObject。在run()方法中,它通过循环从0到100依次发送进度更新信号progress。
MainWindow类是主窗口类,继承自QMainWindow。在__init__()方法中,创建了一个QProgressBar 并设置布局,然后创建了一个Worker 实例worker ,创建了一个 QThread实例 thread。 使用moveToThread 将 work 添加到线程中
该应用程序会无边框窗口,点击开始每秒更新一次进度信息,直到达到100%为止。这个例子展示了使用QThread和信号槽机制在PyQt5中实现多线程的简单应用场景,以及如何在主线程中更新用户界面;
3.Code:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar,QPushButton,QVBoxLayout,QWidget
from PyQt5.QtCore import QThread, QObject, pyqtSignal, Qt
class WorkerSignals(QObject):
finished = pyqtSignal(int)
progress = pyqtSignal(int)
class Worker(QObject):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
self.signals = WorkerSignals()
def run(self):
total_steps = 100
for i in range(total_steps):
self.signals.progress.emit(int(i / total_steps * 100))
# 模拟耗时任务
QThread.msleep(100)
self.signals.finished.emit(100)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.cenWidget = QWidget()
self.cenWidget.setFixedSize(600,100)
self.vLayout = QVBoxLayout()
self.cenWidget.setLayout(self.vLayout)
self.progress_bar = QProgressBar()
self.setCentralWidget(self.cenWidget)
self.thread = QThread()
self.worker = Worker()
self.worker.signals.progress.connect(self.update_progress)
self.worker.signals.finished.connect(self.finished)
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run)
self.start_button = QPushButton('Start')
self.start_button.clicked.connect(self.start_task)
self.setWindowTitle('Progress Bar Example')
self.vLayout.addWidget(self.progress_bar)
self.vLayout.addWidget(self.start_button)
self.show()
def start_task(self):
self.thread.start()
def update_progress(self, n):
self.progress_bar.setValue(n)
def finished(self, n):
self.progress_bar.setValue(n) # 设置进度条为100%
self.thread.quit() # 退出线程
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.setWindowFlags(Qt.FramelessWindowHint)
mainWin.show()
sys.exit(app.exec_())