PyQt5 pyqt多线程操作入门

  

PyQt5 是一组 Python 绑定 Qt 库的 Python 模块,支持开发界面程序。通过多线程操作可以提升程序的运行效率和用户体验。以下是一份关于 PyQt5 多线程操作入门的攻略。

环境搭建

在开发 PyQt5 多线程程序前,我们需要先准备好以下两个软件的安装:

  1. Python 3.x。可前往官网下载并安装。

  2. PyQt5 模块。使用 pip 命令安装,终端输入:

pip install PyQt5

多线程操作示例

示例 1:通过继承 QThread 类实现多线程任务

import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton


class MyThread(QThread):
    """自定义线程类"""
    thread_signal = pyqtSignal(int)

    def __init__(self, start=1, end=100):
        super().__init__()
        self.start_value = start
        self.end_value = end

    def run(self):
        """线程任务"""
        for i in range(self.start_value, self.end_value):
            self.thread_signal.emit(i)


class MainWindow(QMainWindow):
    """主窗口类"""
    def __init__(self):
        super().__init__()
        self.p_bar = QProgressBar(self)
        self.p_bar.setGeometry(50, 70, 200, 25)
        self.btn = QPushButton("Start", self)
        self.btn.setGeometry(80, 120, 120, 25)

        self.thread = MyThread()
        self.thread.thread_signal.connect(self.update_progress)
        self.btn.clicked.connect(self.thread.start)
        self.setGeometry(300, 300, 300, 200)

    def update_progress(self, value):
        """更新进度条"""
        self.p_bar.setValue(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

该示例程序创建了一个新的线程,该线程从 start 到 end 值间的整数依次输出。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QThread 是实现线程操作的一种常用方式。

示例 2:通过继承 QObject 类实现 QObject 多线程管理

import sys
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton


class MyWorker(QObject):
    """基于QObject的工作进程"""
    progress_changed = pyqtSignal(int)

    @pyqtSlot()
    def do_work(self):
        """工作任务"""
        for i in range(1, 101):
            self.progress_changed.emit(i)


class MyThread(QThread):
    """基于QThread的线程类"""
    def __init__(self, worker):
        super().__init__()
        self.worker = worker

    def run(self):
        """线程任务"""
        self.worker.do_work()


class MainWindow(QMainWindow):
    """主窗口类"""
    def __init__(self):
        super().__init__()
        self.p_bar = QProgressBar(self)
        self.p_bar.setGeometry(50, 70, 200, 25)

        self.btn = QPushButton("Start", self)
        self.btn.setGeometry(80, 120, 120, 25)

        self.worker = MyWorker()

        self.thread = MyThread(self.worker)
        self.worker.progress_changed.connect(self.update_progress)
        self.btn.clicked.connect(self.thread.start)

        self.setGeometry(300, 300, 300, 200)

    def update_progress(self, value):
        """更新进度条"""
        self.p_bar.setValue(value)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())

该示例程序创建了一个新的线程,该线程启动 worker 任务,并且基于 Qt 的 QObject 类来实现报告信号和进度 moved 信号。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QObject 和 QThread 是共同实现多线程操作的最佳方式。

总结

通过上述的两个示例,我们了解并应用了 QThread 和 QObject 类多线程操作的实现方式。当我们需要同时处理和展示大量的数据时,多线程操作可以有效提高我们的程序效率和用户体验。

相关文章