PyQt5 笔记4 – 多线程


1、多线程

QT 程序的设计应该遵循UI线程与工作线程分离的原则,否则可能会因为工作线程运行时间太久造成程序未响应问题。如果程序有多个功能要同步执行,也必须另开线程执行。
QT 多线程的使用主要是通过 QThread 来实现。有两种方法:一种是创建一个继承自QThread的类并重写它的run()方法;另一种是,创建类,实例化对象并转换为线程对象。


2、重写QThread的run()方法

创建一个继承自QThread的类并重写它的run()方法

# 创建视频播放的线程类:
class Thread(QThread):# 自定义信号show_signal = pyqtSignal(QImage)# 构造函数,接受参数def __init__(self, file_name, browser):QThread.__init__(self)self.video_name = file_nameself.browser = browser# 重写run()方法def run(self):# 实例化一个读取视频对象cap = cv2.VideoCapture(self.video_name)while cap.isOpened():# 读取视频帧ret, frame = cap.read()# 获取视频的帧数fps = cap.get(cv2.CAP_PROP_FPS)if ret:# 转换图片格式rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)qt_image = QImage(rgb_image.data, rgb_image.shape[1], rgb_image.shape[0], QImage.Format_RGB888)p = qt_image.scaled(640, 480, Qt.KeepAspectRatio)# 发射信号self.show_signal.emit(p)time.sleep(1/fps)else:image = QImage('E:/11.jpg')self.browser.ui.lb_show.setPixmap(QPixmap.fromImage(image))self.browser.ui.lb_show.adjustSize()print('播放结束')break

使用创建的线程

# 实例化线程对象,并传入参数。
th = Thread(file_name, self)# 绑定信号与槽
th.show_signal.connect(self.show_image)# 开启线程
th.start()# 等待线程结束。括号内可填写等待时间。
# th.wait()
# 关闭线程
# th.quit()

node: 如果是在函数中实例化线程对象,要实例化为全局对象或者类对象,要不然函数结束后会销毁资源,导致程序崩溃。


3、工作对象转换为线程对象

创建一个继承自QObject的类并写一个想要运行的函数

class Worker(QObject):def __init__(self, parent=None):super(Worker, self).__init__(parent)def work(self):print('当前线程: %s' % hex(int(QThread.currentThreadId())))

实例化工作对象并转换为线程对象

# 查看当前线程id
print('主线程: %s' % hex(int(QThread.currentThreadId())))# 实例化线程对象
t = QThread()# 实例化工作类对象
worker = Worker()# 工作类对象转化为线程对象
worker.moveToThread(t)# 绑定线程启动信号的槽函数
t.started.connect(worker.work)# 启动线程
t.start()

node: 如果不是通过启动线程调用worker.work,而是直接调用worker.work这样是不会开启新线程的。


PyQt5 笔记4 -- 多线程相关推荐

  1. PyQt5 笔记7 -- 多个类共享信号

    PyQt5 笔记7 – 多个类共享信号 应用:对话框发送信号给主窗口,控制主窗口的控件 1.信号传递 主窗口类中自定义信号并在构造函数中绑定槽函数 实例化对话框类时把主窗口的对象传过去 对话框中自定义 ...

  2. PyQt5 笔记6 -- 对话框(QDialog)

    PyQt5 笔记6 – 对话框(QDialog) 1.主窗口弹出对话框 import sys from PyQt5.QtWidgets import QApplication, QMainWindow ...

  3. PyQt5 笔记5 -- 消息框(QMessageBox)

    PyQt5 笔记5 – 消息框(QMessageBox) 1.常用函数 函数原型: # 信息框 QMessageBox.information(self, '框名', '内容', 按钮s, 默认按钮) ...

  4. PyQt5 笔记3 -- 信号与槽

    PyQt5 笔记3 – 信号与槽(signals and slots) 学习资料: PyQt5 教程 PyQt5 官方文档 1.信号与槽 QT所有的应用都是事件驱动的.事件大部分都是由用户的行为产生的 ...

  5. PyQt5 笔记2 -- Qt Designer使用

    PyQt5 笔记2 – Qt Designer使用 1.打开Qt Designer Tools > External Tools > Qt Designer 2.新建窗口 选择 Main ...

  6. PyQt5 笔记1 -- 环境配置

    PyQt5 笔记1 – 环境配置 1.安装 pyqt5 pip3 install pyqt5 2.安装 pyqt5-tools pip3 install pyqt5-tools 3.Pycharm 配 ...

  7. Java读书笔记(4)-多线程(二)

    Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...

  8. PyQt5笔记(08) – 输入对话框

    目录 PyQt5笔记(01) – 创建空白窗体 PyQt5笔记(02) – 按钮点击事件 PyQt5笔记(03) – 消息框 PyQt5笔记(04) – 文本框的使用 PyQt5笔记(05) – 绝对 ...

  9. PyQt5笔记(07) -- 变换控件颜色

    目录 PyQt5笔记(01) – 创建空白窗体 PyQt5笔记(02) – 按钮点击事件 PyQt5笔记(03) – 消息框 PyQt5笔记(04) – 文本框的使用 PyQt5笔记(05) – 绝对 ...

最新文章

  1. maven 获取pom.xml的依赖---即仓库搜索服务
  2. linux gcc 链接静态库的几种方式
  3. 《Splunk智能运维实战》——3.6 制作每一主机不同请求方法数量的图表
  4. 科大星云诗社动态20210226
  5. 用jfreechart在JSP页面显示点状分布图+分割线(转载:http://blog.csdn.net/ami121/article/details/2450945)
  6. Ubuntu文件上锁了,怎么打开???亲测有效
  7. MySQL应用安装_mysql安装和应用
  8. 轻松入门CAS系列(1)-轻松看懂企业单点登录的解决方案
  9. CSS 选择器优先级
  10. [CMake] include_directories 和 target_include_directories
  11. WordPress资源站点推荐
  12. python+opencv 问题解决方案,OpenCV Error: Unspecified error (The function is not implemented. Rebuild the
  13. Q98:三角形网格细分Bezier曲面时,注意三角形顶点的顺序(确保其对应的法向量向外)
  14. c++ 调用程序接口_添加系统调用(返回文件信息)
  15. c mysql中文乱码解决方案_Linux下c读取MysqL中文乱码解决方案
  16. Vue 可拖拽的组件
  17. SessionFactory的用法
  18. 【能效管理】安科瑞远程预付费系统在江西某沃尔玛收费管理的应用
  19. 路由(gorilla/mux)
  20. 深度余弦度量学习(cosine-metric-learning)在VeRi数据集调试

热门文章

  1. redis操作帮助类
  2. JSON进阶第二篇 AJAX方式传递JSON数据
  3. view.ondraw
  4. MAC设置——企业邮箱标准版
  5. 首届CCF真题5-任务调度
  6. 解决 wget 使用 https 下载报错的问题
  7. 由浅入深之Jq选择器(2)
  8. 准备写一个Ibatisnet开发指南
  9. oracle函数 trunc(x[,y])
  10. 分布式集群环境下,如何实现session共享三(环境搭建)