PyQt5 笔记4 -- 多线程
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 -- 多线程相关推荐
- PyQt5 笔记7 -- 多个类共享信号
PyQt5 笔记7 – 多个类共享信号 应用:对话框发送信号给主窗口,控制主窗口的控件 1.信号传递 主窗口类中自定义信号并在构造函数中绑定槽函数 实例化对话框类时把主窗口的对象传过去 对话框中自定义 ...
- PyQt5 笔记6 -- 对话框(QDialog)
PyQt5 笔记6 – 对话框(QDialog) 1.主窗口弹出对话框 import sys from PyQt5.QtWidgets import QApplication, QMainWindow ...
- PyQt5 笔记5 -- 消息框(QMessageBox)
PyQt5 笔记5 – 消息框(QMessageBox) 1.常用函数 函数原型: # 信息框 QMessageBox.information(self, '框名', '内容', 按钮s, 默认按钮) ...
- PyQt5 笔记3 -- 信号与槽
PyQt5 笔记3 – 信号与槽(signals and slots) 学习资料: PyQt5 教程 PyQt5 官方文档 1.信号与槽 QT所有的应用都是事件驱动的.事件大部分都是由用户的行为产生的 ...
- PyQt5 笔记2 -- Qt Designer使用
PyQt5 笔记2 – Qt Designer使用 1.打开Qt Designer Tools > External Tools > Qt Designer 2.新建窗口 选择 Main ...
- PyQt5 笔记1 -- 环境配置
PyQt5 笔记1 – 环境配置 1.安装 pyqt5 pip3 install pyqt5 2.安装 pyqt5-tools pip3 install pyqt5-tools 3.Pycharm 配 ...
- Java读书笔记(4)-多线程(二)
Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...
- PyQt5笔记(08) – 输入对话框
目录 PyQt5笔记(01) – 创建空白窗体 PyQt5笔记(02) – 按钮点击事件 PyQt5笔记(03) – 消息框 PyQt5笔记(04) – 文本框的使用 PyQt5笔记(05) – 绝对 ...
- PyQt5笔记(07) -- 变换控件颜色
目录 PyQt5笔记(01) – 创建空白窗体 PyQt5笔记(02) – 按钮点击事件 PyQt5笔记(03) – 消息框 PyQt5笔记(04) – 文本框的使用 PyQt5笔记(05) – 绝对 ...
最新文章
- maven 获取pom.xml的依赖---即仓库搜索服务
- linux gcc 链接静态库的几种方式
- 《Splunk智能运维实战》——3.6 制作每一主机不同请求方法数量的图表
- 科大星云诗社动态20210226
- 用jfreechart在JSP页面显示点状分布图+分割线(转载:http://blog.csdn.net/ami121/article/details/2450945)
- Ubuntu文件上锁了,怎么打开???亲测有效
- MySQL应用安装_mysql安装和应用
- 轻松入门CAS系列(1)-轻松看懂企业单点登录的解决方案
- CSS 选择器优先级
- [CMake] include_directories 和 target_include_directories
- WordPress资源站点推荐
- python+opencv 问题解决方案,OpenCV Error: Unspecified error (The function is not implemented. Rebuild the
- Q98:三角形网格细分Bezier曲面时,注意三角形顶点的顺序(确保其对应的法向量向外)
- c++ 调用程序接口_添加系统调用(返回文件信息)
- c mysql中文乱码解决方案_Linux下c读取MysqL中文乱码解决方案
- Vue 可拖拽的组件
- SessionFactory的用法
- 【能效管理】安科瑞远程预付费系统在江西某沃尔玛收费管理的应用
- 路由(gorilla/mux)
- 深度余弦度量学习(cosine-metric-learning)在VeRi数据集调试