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 相关文章推荐
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
Python实现识别手写数字大纲
Jan 29 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
Apr 03 Python
教你用Python爬取英雄联盟皮肤原画
Jun 13 Python
Pytorch中expand()的使用(扩展某个维度)
Jul 15 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP 快速排序算法详解
2014/11/10 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
类的核心特性有哪些
2014/01/01 面试题
信息技术毕业生自荐信范文
2014/03/13 职场文书
工商管理本科生求职信
2014/07/13 职场文书
毕业证代领委托书
2014/09/26 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2014年终工作总结范本
2014/12/15 职场文书
2014小学年度工作总结
2014/12/20 职场文书
公司聚餐通知
2015/04/22 职场文书
企业战略合作意向书
2015/05/08 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
浅谈MySQL user权限表
2021/06/18 MySQL
Elasticsearch 索引操作和增删改查
2022/04/19 Python