PyQt 线程类 QThread使用详解


Posted in Python onJuly 16, 2017

PyQt中的线程类 QtCore.QThread ,使用时继承QThread类

启动界面的线程暂称为UI线程。界面执行命令时都在自己的UI线程中。

如果在UI线程中执行网络连接和数据库操作等耗时的操作,界面会被卡住,Windows下有可能会出现“无响应”的警告。

阻塞UI线程会降低用户体验和应用稳定性。因此我们可以把耗时操作放在线程中去执行。

QThread代表一个线程,我们可以复写run函数来执行我们要的操作。

QThread可以使用 QtCore.pyqtSignal 来与界面交互和传输数据。

PyQt4 QThread 代码示例

•Python2.7
# -*- coding: utf-8 -*-
import sys

from PyQt4 import QtCore
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QWidget, QPushButton, QApplication, QTextBrowser


class TimeThread(QtCore.QThread):
  signal_time = QtCore.pyqtSignal(str, int) # 信号

  def __init__(self, parent=None):
    super(TimeThread, self).__init__(parent)
    self.working = True
    self.num = 0

  def start_timer(self):
    self.num = 0
    self.start()

  def run(self):
    while self.working:
      print "Working", self.thread()
      self.signal_time.emit("Running time:", self.num) # 发送信号
      self.num += 1
      self.sleep(1)


class TimeDialog(QWidget):
  def __init__(self):
    super(TimeDialog, self).__init__()
    self.timer_tv = QTextBrowser(self)
    self.init_ui()
    self.timer_t = TimeThread()
    self.timer_t.signal_time.connect(self.update_timer_tv)

  def init_ui(self):
    self.resize(300, 200)
    self.setWindowTitle('TimeDialog')
    self.timer_tv.setText("Wait")
    self.timer_tv.setGeometry(QtCore.QRect(10, 145, 198, 26))
    self.timer_tv.move(0, 15)

    btn1 = QPushButton('Quit', self)
    btn1.setToolTip('Click to quit')
    btn1.resize(btn1.sizeHint())
    btn1.move(200, 150)
    btn1.clicked.connect(QCoreApplication.instance().quit)

    start_btn = QPushButton('Start', self)
    start_btn.setToolTip("Click to start")
    start_btn.move(50, 150)
    self.connect(start_btn, QtCore.SIGNAL("clicked()"), self.click_start_btn)

  def click_start_btn(self):
    self.timer_t.start_timer()

  def update_timer_tv(self, text, number):
    self.timer_tv.setText(self.tr(text + " " + str(number)))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  time_dialog = TimeDialog()
  time_dialog.show()

  sys.exit(app.exec_())

QThread中使用的信号 signal_time = QtCore.pyqtSignal(str, int) 指定了参数str和int

发送信号 self.signal_time.emit("Running time:", self.num)

外部接收信号 self.timer_t.signal_time.connect(self.update_timer_tv)
信号连接到方法 update_timer_tv(self, text, number) ,注意信号与方法的参数要一一对应

使用中我们可以定义多种不同的信号 QtCore.pyqtSignal

启动线程,调用 start()

Python 相关文章推荐
一则python3的简单爬虫代码
May 26 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 Python
Python3 中文文件读写方法
Jan 23 Python
Python模块文件结构代码详解
Feb 03 Python
如何用python整理附件
May 13 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
python用post访问restful服务接口的方法
Dec 07 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python统计文章中单词出现次数实例
Feb 27 Python
Python 绘制可视化折线图
Jul 22 Python
如何更换python默认编辑器的背景色
Aug 10 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 #Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 #Python
Python利用flask sqlalchemy实现分页效果
Aug 02 #Python
Python实现发送QQ邮件的封装
Jul 14 #Python
python记录程序运行时间的三种方法
Jul 14 #Python
python运行其他程序的实现方法
Jul 14 #Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 #Python
You might like
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php设置session值和cookies的学习示例
2014/03/21 PHP
检测codeigniter脚本消耗内存情况的方法
2015/03/21 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
JS闭包原理及其使用场景解析
2020/12/03 Javascript
python 正则表达式 概述及常用字符
2009/05/04 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
python导入模块交叉引用的方法
2019/01/19 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
Python安装Bs4的多种方法
2020/11/28 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
五年级语文教学反思
2014/01/30 职场文书
仓管岗位职责范本
2014/02/08 职场文书
请假条范文大全
2014/04/10 职场文书
社区义诊活动总结
2014/04/30 职场文书
物业管理专业求职信
2014/06/11 职场文书
横幅标语大全
2014/06/17 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
五年级作文之学校的四季
2019/12/05 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA