[PyQt5] PyQt5 多线程 QThread 实现(转载)

简介

QThread类提供了一种独立于平台的线程管理方法。

QThread对象管理程序中的一个控制线程。在run()中开始执行QThreads。默认情况下,run()通过调用exec()启动事件循环,并在线程中运行Qt事件循环。

创建一个新线程

class Thread(QThread):
    def __init__(self):
        super().__init__()
    def run(self):
        # 线程相关代码
        pass
# 创建一个新的线程
thread = Thread()
thread.start()

在使用线程时可以直接得到Thread实例,调用其start()函数即可启动线程,线程启动后,会调用其实现的run方法,该方法就是线程的执行函数,当run()退出之后线程基本就结束了。

QThread中常用的方法

【PyQt5】PyQt5 多线程 QThread 实现

例子实现

下面的例子通过在QThread中定义两个自定义信号实现时间的变化和动态为QListWidget添加控件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2019年1月16日
@author: yiluo
@site: https://github.com/bingshilei
@email: 786129166@qq.com
@file: QThreadDemo2
@description: 使用多线程动态添加控件
"""
import time

from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QWidget, QLineEdit, QListWidget, QPushButton,\
    QVBoxLayout, QLabel

'''
声明线程类
'''

class addItemThread(QThread):
    add_item = pyqtSignal(str)
    show_time = pyqtSignal(str)

    '''
            添加控件
    '''
    def __init__(self,*args, **kwargs):
        super(addItemThread, self).__init__(*args, **kwargs)
        self.num = 0

    def run(self, *args, **kwargs):
        while True:
            file_str = 'File index{0}'.format(self.num,*args, **kwargs)
            self.num +=1

            #发送添加信号
            self.add_item.emit(file_str)

            date = QDateTime.currentDateTime()
            currtime = date.toString('yyyy-MM-dd hh:mm:ss')
            print(currtime)
            self.show_time.emit(str(currtime))

            time.sleep(1)

class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.setWindowTitle('多线程动态添加控件')
        # x,y,w,h
        self.setGeometry(800, 100, 500, 750)
        #创建QListWidget控件
        self.listWidget = QListWidget()
        #创建按钮控件
        self.btn = QPushButton('开始',self)
        self.lb = QLabel('显示时间',self)
        #创建布局控件
        self.vlayout = QVBoxLayout()
        #将按钮和列表控件添加到布局
        self.vlayout.addWidget(self.btn)
        self.vlayout.addWidget(self.lb)
        self.vlayout.addWidget(self.listWidget)
        #设置窗体的布局
        self.setLayout(self.vlayout)

        #绑定按钮槽函数
        self.btn.clicked.connect(self.startThread)

        #声明线程实例
        self.additemthread = addItemThread()

        #绑定增加控件函数
        self.additemthread.add_item.connect(self.addItem)

        #绑定显示时间函数

        self.additemthread.show_time.connect(self.showTime)

    '''
    @description:按钮开始,启动线程
    '''
    def startThread(self):
        #按钮不可用
        self.btn.setEnabled(False)
        #启动线程
        self.additemthread.start()

    '''
    @description:为listwidget增加项
    @param:项的值 
    '''
    def addItem(self,file_str):
        self.listWidget.addItem(file_str)

    '''
    @description:显示时间
    @param:项的值 
    '''
    def showTime(self,time):
        self.lb.setText(time)

if __name__ == '__main__':
    import sys
    from PyQt5.QtWidgets import QApplication
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

运行结果

点击开始按钮,时间会进行变化,且在下方为QListWidget不断增加项

【PyQt5】PyQt5 多线程 QThread 实现(转载)

【PyQt5】PyQt5 多线程 QThread 实现(转载)

以上,就是自定义信号和QThread的运用。

谢谢您宝贵时间观看。

作者:卖火柴的小小喷泉

链接:https://www.jianshu.com/p/18d7b119edcc

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!