在开发的过程中经常会遇到一些耗时的程序,然后程序就会卡在耗时程序段中,造成ui无法实时刷新,本例用qt线程实现计时程序和主程序同时进行计算操作,左边计时,右边可以进行计算操作,互不影响

  • 重写线程类

from PyQt5.QtWidgets import *
from PyQt5.QtCore import QThread, pyqtSignal
import sys
import timeclass MyWin(QWidget):def __init__(self):super(MyWin, self).__init__()self.setWindowTitle('QThread')self.setupUi()self.mythread = MyThread()  # 实例化线程self.mythread.signal.connect(self.customslot)  #连接线程类中自定义信号槽到本类的自定义槽函数self.mythread.start() #开启线程不是调用run函数而是调用start函数def setupUi(self):'''左边布局'''self.lineEdit = QLineEdit()self.lineEdit.setText('0')self.layoutleft = QHBoxLayout()self.layoutleft.addWidget(self.lineEdit)self.left = QWidget()self.left.setLayout(self.layoutleft)self.left.setStyleSheet("QWidget{border: 1px solid #FF0000;}")'''右边布局'''self.btn = QPushButton('calculate')self.btn.clicked.connect(self.add)self.lineEdit1 = QLineEdit()self.lineEdit2 = QLineEdit()self.result = QLineEdit()self.formlayout = QFormLayout()# self.formlayout.setVerticalSpacing()self.formlayout.addRow('加数1', self.lineEdit1)self.formlayout.addRow('加数2', self.lineEdit2)self.formlayout.addRow('计算结果', self.result)self.vbox = QVBoxLayout()self.vbox.addLayout(self.formlayout)self.vbox.addWidget(self.btn)self.right = QWidget()self.right.setLayout(self.vbox)self.right.setStyleSheet("QWidget{border: 1px solid #FF0000;}")'''设置总布局'''self.hbox = QHBoxLayout()self.hbox.addWidget(self.left)self.hbox.addWidget(self.right)self.setLayout(self.hbox)def add(self):value = str(int(self.lineEdit1.text())+int(self.lineEdit2.text()))self.result.setText(value)def customslot(self, i):self.lineEdit.setText(i)class MyThread(QThread):  #重写线程类signal = pyqtSignal(str)  #自定义一个pyqtSignal信号,信号参数是个字符串str类型count = 0def __init__(self):super(MyThread, self).__init__()def run(self):while True:self.signal.emit(str(self.count)) #发射信号time.sleep(1)self.count += 1if __name__ == '__main__':app = QApplication(sys.argv)mywin = MyWin()  mywin.show()  sys.exit(app.exec())

效果:

  • 不重写线程类

与上面不同的是添加了一条线程结束的信号,当线程结束后发射信号,接收到信号后调用退出线程的函数

from PyQt5.QtWidgets import *
from PyQt5.QtCore import QThread, pyqtSignal, QObject, pyqtSlot
import sys
import timeclass MyWin(QWidget):def __init__(self):super(MyWin, self).__init__()self.setWindowTitle('QThread')self.setupUi()self.work = threadRun()self.mythread = QThread()  # 实例化线程self.work.moveToThread(self.mythread) #处理程序移到线程中self.work.start_signal.connect(self.customslot)self.work.stop_signal.connect(self.stopThread)self.mythread.started.connect(self.work.work)self.mythread.start()  # 开启线程不是调用run函数而是调用start函数def setupUi(self):'''左边布局'''self.lineEdit = QLineEdit()self.lineEdit.setText('0')self.layoutleft = QHBoxLayout()self.layoutleft.addWidget(self.lineEdit)self.left = QWidget()self.left.setLayout(self.layoutleft)self.left.setStyleSheet("QWidget{border: 1px solid #FF0000;}")'''右边布局'''self.btn = QPushButton('calculate')self.btn.clicked.connect(self.add)self.lineEdit1 = QLineEdit()self.lineEdit2 = QLineEdit()self.result = QLineEdit()self.formlayout = QFormLayout()self.formlayout.addRow('加数1', self.lineEdit1)self.formlayout.addRow('加数2', self.lineEdit2)self.formlayout.addRow('计算结果', self.result)self.vbox = QVBoxLayout()self.vbox.addLayout(self.formlayout)self.vbox.addWidget(self.btn)self.right = QWidget()self.right.setLayout(self.vbox)self.right.setStyleSheet("QWidget{border: 1px solid #FF0000;}")'''设置总布局'''self.hbox = QHBoxLayout()self.hbox.addWidget(self.left)self.hbox.addWidget(self.right)self.setLayout(self.hbox)def add(self):value = str(int(self.lineEdit1.text()) + int(self.lineEdit2.text()))self.result.setText(value)def customslot(self, i):self.lineEdit.setText(str(i))def stopThread(self):self.lineEdit.setText('线程结束')self.mythread.exit() #调用线程退出函数class threadRun(QObject):start_signal = pyqtSignal(int)stop_signal = pyqtSignal()@pyqtSlot()def work(self):  # A slot takes no paramsfor i in range(1, 10):time.sleep(1)self.start_signal.emit(i)self.stop_signal.emit()
if __name__ == '__main__':app = QApplication(sys.argv)mywin = MyWin()mywin.show()sys.exit(app.exec())

效果:

PyQt5 QThread应用相关推荐

  1. PyQt5 QThread

    PyQt5 QThread QThread是Qt线程类中最核心的底层类.要使用QThrea开始一个线程,可以创建它的一个子类,然后覆盖其QThread.run()函数. class Thread(QT ...

  2. PyQt5基础知识大全

    PyQT与Opencv结合的案例 Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程) PyQt:桌面程序设计的饕餮盛宴 快速掌握PyQt5 个人QT学习笔记(部分重点内容) 生成 ...

  3. pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。

    渣渣用法,请等待我心情好的时候更新. 1.第一个例子 1.1 先看mainwindow.py from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Ma ...

  4. PyQt5之QThread线程模块

    PyQt5之QThread线程模块 版权声明:版权没有,转载随意 https://blog.csdn.net/MAOZEXIJR/article/details/80983337 一.QThread ...

  5. Pyqt5:使用多线程QThread

    Pyqt5安装并配置到pycharm方法:完全弄懂如何用pycharm安装pyqt5及其相关配置 Pyqt5播放视频:Pyqt5:使用Qlabel标签进行视频播放 本内容是根据之前写的内容(Pyqt5 ...

  6. pyqt5多线程使用方法及学习案例(QThread)

    在使用pyqt5的过程中,会存在界面卡死的现象,为了优化改善,可以利用多线程来解决此类问题.可以实现信号与槽在多个线程中的相互传递数据. 用法很简单,创建一个进程类,不同触发时刻分别调用即可. 参考案 ...

  7. PyQT5线程:多线程(QThread),线程锁(QMutex)

    在编写GUI界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问 ...

  8. 【PyQt5】:QThread:Destroyed while thread is still running 解决方法

    PyQt5在执行多线程的时候遇到:QThread:Destroyed while thread is still running 错误分析: QThread的子线程还在运行但是线程就被销毁了,导致程序 ...

  9. Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

    目录 1.QTimer计时器类 2.QThread多线程类 3.事件处理类 一般情况下,应用程序都是单线程运行的,但是对于GUI程序来说,单线程有时候满足不了需求.例如,如果需要执行一个特别耗时的操作 ...

  10. PyQt5 笔记(04):主窗口卡死问题

    本文基于:windows 7 + python 3.4 知识点: 1. 将 time.sleep 替换为 QTimer 2. 将 time.sleep 放入到 QThread 3. 使用 QThrea ...

最新文章

  1. javascript 死循环
  2. String和C#中的string有什么区别?
  3. 使用matplotlib进行简单的数据展示
  4. python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解
  5. python julian date_Python 的内嵌time模板翻译及说明
  6. python图像处理的常用操作
  7. 亲密关系-【沟通提示】-如何把学习到的东西用到生活中
  8. 实训|第七天横扫Linux磁盘分区、软件安装障碍附制作软件仓库
  9. RejectedExecutionException 分析
  10. TestStand-编辑VI
  11. 计算机模拟比赛,关于参加2017年中小学计算机模拟城市设计比赛的通知
  12. 无法修改计算机时间权限,Win10无法修改时间怎么办?Win10修改系统时间没有权限的解决方法...
  13. android启用hdcp_如何在Android的Google键盘中启用单手模式
  14. Android开发笔记之视频录制
  15. 程序猿,你关心过自己的健康吗?
  16. Python爬虫方式抓取免费http代理IP
  17. Google Open Images Dataset V4
  18. 第五章 大数定律及中心极限定律
  19. 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!
  20. 30个HTML+CSS前端开发案例(完结篇)

热门文章

  1. xps in html5,学术干货 | 带你“一网捞尽”XPS 基本理论【绝对没有套路】
  2. 文件系统FAT32、NTFS、exFAT的对比
  3. vs2015如何建立c语言程序,C语言快速入门——使用Visual Studio 2015创建控制台应用程序...
  4. 敏感词在线检测-敏感词在线检测工具
  5. Photoshop插件-删除亮调通道蒙板-脚本开发-PS插件
  6. 计算机网络(第七版)部分课后习题含答案第一章 概述1-02 试简述分组交换的要点。分组交换最主要的特点就是采用存储转发技术。我们把要发送的整块数据称为一个报文。在发送报文之前,先把较长的报
  7. python numpy.linalg.norm函数的用法
  8. 《自己动手写网络爬虫》笔记5-设计爬虫对列
  9. 如何从0开始编写一个网络爬虫?
  10. linux制作虚拟机镜像,为OpenStack制作CoreOS虚拟机镜像(基于CoreOS官方提供镜像)