pyqt5 信号和槽函数以及Qthread 多线程的简单的例子

写了一个简单的例子: 包含一个主窗口和一个按钮。点击按钮时,我们将启动一个耗时的任务(在这里我们使用time.sleep来模拟)。为了不阻塞主线程,我们将在一个单独的线程中运行这个任务。同时,我们将显示一个进度条来展示任务的进度, 直接上代码

import sys  # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time  # 导入time模块,用于处理时间
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar, QVBoxLayout, QWidget  # 从PyQt5.QtWidgets模块导入需要的类
from PyQt5.QtCore import QThread, pyqtSignal  # 从PyQt5.QtCore模块导入QThread和pyqtSignal类
from PyQt5 import QtWidgets  # 导入PyQt5的QtWidgets模块

class Worker(QThread):  # 定义一个Worker类,继承自QThread
    progressChanged = pyqtSignal(int)  # 定义一个名为progressChanged的信号,用于在任务进度改变时发出

    def run(self):  # 定义run方法,该方法在调用start方法后自动运行
        for i in range(101):  # 循环101次,模拟一个耗时任务
            time.sleep(0.1)  # 暂停0.1秒
            self.progressChanged.emit(i)  # 发出progressChanged信号,传递当前进度

class MainWindow(QMainWindow):  # 定义一个MainWindow类,继承自QMainWindow
    def __init__(self, parent=None):  # 定义构造函数
        super(MainWindow, self).__init__(parent)  # 调用父类的构造函数
        self.setWindowTitle("PyQt5 App")  # 设置窗口标题

        self.button = QPushButton("Start Task")  # 创建一个按钮,文本为"Start Task"
        self.button.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)  # 设置按钮的大小策略为Expanding,即按钮会尽可能地占用可用空间
        self.button.clicked.connect(self.startTask)  # 将按钮的clicked信号连接到startTask方法

        self.progressBar = QProgressBar()  # 创建一个进度条
        self.progressBar.setValue(0)  # 设置进度条的初始值为0

        layout = QVBoxLayout()  # 创建一个垂直布局
        layout.addWidget(self.button)  # 将按钮添加到布局中
        layout.addWidget(self.progressBar)  # 将进度条添加到布局中

        centralWidget = QWidget()  # 创建一个中心部件
        centralWidget.setLayout(layout)  # 将布局设置到中心部件
        self.setCentralWidget(centralWidget)  # 将中心部件设置到主窗口

        self.worker = Worker()  # 创建一个Worker对象
        self.worker.progressChanged.connect(self.progressBar.setValue)  # 将Worker的progressChanged信号连接到进度条的setValue方法

    def startTask(self):  # 定义startTask方法
        self.worker.start()  # 启动Worker线程

app = QApplication(sys.argv)  # 创建一个QApplication对象
window = MainWindow()  # 创建一个MainWindow对象
window.show()  # 显示主窗口
sys.exit(app.exec_())  # 进入事件循环,等待用户操作

首先创建了一个Worker类,它是QThread的子类。这个类有一个信号progressChanged,用于在任务进度改变时发出。run方法中的循环模拟了一个耗时任务,每次迭代都会暂停0.1秒,然后发出progressChanged信号。 MainWindow类是主窗口。它包含一个按钮和一个进度条。按钮的clicked信号连接到startTask方法,该方法启动Worker线程。进度条的值由Worker的progressChanged信号控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值