PyQt5 多进程 多任务 多线程实现进度条功能 无边框 含源码

作者 : admin 本文共2097个字,预计阅读时间需要6分钟 发布时间: 2024-06-10 共2人阅读

概述:

在项目 中我们常遇到,大量计算或者加载数据时,需要用到多线程,此时只能等待,我们这个时间需要添加一下进度条,告诉用户当前需要等待,这时间就需要用到多线程和等待进度条;

效果:

PyQt5 多进程 多任务 多线程实现进度条功能 无边框 含源码插图

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_())

                        
 

本站无任何商业行为
个人在线分享 » PyQt5 多进程 多任务 多线程实现进度条功能 无边框 含源码
E-->