美文网首页PyQtpyqt学习笔记
PyQt5多线程QThread实现

PyQt5多线程QThread实现

作者: 酉月十一 | 来源:发表于2019-01-16 22:38 被阅读2次

    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中常用的方法


    QThread常用方法.png

    例子实现
    下面的例子通过在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不断增加项


    运行结果1.png
    运行结果2.png

    以上,就是自定义信号和QThread的运用。
    谢谢您宝贵时间观看。

    相关文章

      网友评论

        本文标题:PyQt5多线程QThread实现

        本文链接:https://www.haomeiwen.com/subject/vcwvdqtx.html