[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中常用的方法
例子实现
下面的例子通过在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
不断增加项
以上,就是自定义信号和QThread
的运用。
谢谢您宝贵时间观看。
作者:卖火柴的小小喷泉
链接:https://www.jianshu.com/p/18d7b119edcc
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: