PyQt 线程类 QThread使用详解

发布时间 - 2026-01-11 02:22:01    点击率:

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()


# PyQt中使用QThread  # PyQt  # 线程  # QThread  # 详解pyqt5 动画在QThread线程中无法运行问题  # pyqt5中QThread在使用时出现重复emit的实例  # 我们可以  # 自己的  # 放在  # 都在  # 可以使用  # 中去  # 连接到  # str  # def  # int  # signal_time  # QApplication  # QPushButton  # QTextBrowser  # QWidget  # TimeThread  # parent  # print  # start  # Working 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何自定义建站之星网站的导航菜单样式?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  C语言设计一个闪闪的圣诞树  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  EditPlus 正则表达式 实战(3)  Laravel怎么实现验证码(Captcha)功能  如何用PHP快速搭建CMS系统?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  网站建设保证美观性,需要考虑的几点问题!  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  高端建站如何打造兼具美学与转化的品牌官网?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Android利用动画实现背景逐渐变暗  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  原生JS实现图片轮播切换效果  大型企业网站制作流程,做网站需要注册公司吗?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  nginx修改上传文件大小限制的方法  javascript日期怎么处理_如何格式化输出  简单实现Android文件上传  原生JS获取元素集合的子元素宽度实例  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何破解联通资金短缺导致的基站建设难题?  PythonWeb开发入门教程_Flask快速构建Web应用  郑州企业网站制作公司,郑州招聘网站有哪些?  网站制作企业,网站的banner和导航栏是指什么?  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  iOS验证手机号的正则表达式  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel怎么为数据库表字段添加索引以优化查询  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel distinct去重查询_Laravel Eloquent去重方法  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何选择PHP开源工具快速搭建网站?  如何挑选优质建站一级代理提升网站排名?  网站页面设计需要考虑到这些问题  手机网站制作与建设方案,手机网站如何建设?  如何获取上海专业网站定制建站电话?  php485函数参数是什么意思_php485各参数详细说明【介绍】  Python面向对象测试方法_mock解析【教程】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】