- 博客(388)
- 资源 (4)
- 收藏
- 关注
原创 Qt Designer的父子部件样式表设置学习
在Qt Designer中新建图像界面,放置两个QWidget,命名为widget_1和widget_2;单独改变了widget_2,但是隶属于widget_2的pushButton_1和pushButton_2并没有改变。需要注意的是,采用这种办法,如果被改变的小部件还有它的子部件,子部件并不跟随被改变的小部件的改变而改变。这里,将隶属于widget_1的类型为QPushButton的所有部件全部定义了新的显示特性。这个样式表的含义为:widget_1中,所有的QWidget都按照指定的样式表显示。
2024-07-27 00:13:29
1477
原创 PLC学习笔记:数据存储的大小端模式
以一个16 位整数(Word)0x1234高字节 0x12(0001 0010)低字节 0x34(0011 0100)
2026-04-19 10:06:46
205
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(十)框架初成的阶段总结
DataStore:变量存储区(变量池)变量池位于上位机,是一个连续区域的存储区,最小存取单位是字节。AreaVar:区域变量区域变量:NamedTuplearea:I、Q、M或DB区,DBnum:DB编号,offset:地址偏移,byte_count:字节数,content:数据内容区域变量的作用是携带区域信息,用来成块读写变量池中和PLC的连续数据。所有的通信读写均通过区域变量进行。UiVari:UI变量。
2026-04-17 17:52:47
347
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(九)在上位机中创建变量系统
将其保存在项目根目录,命名为:PLC1Tags.xlsx。将其导出为excel文件。在excel表中利用。
2026-04-16 12:07:19
19
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(八)在上位机中解析上行报文
当接收到上行报文后首先对帧头和帧尾进行校验,如果校验不过就舍弃帧数据。然后经过CRC校验,确保所有数据无误,将帧数据保存。
2026-04-15 18:21:45
46
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(七)上位机通信部分的初步建设:socket客户端
signal_start = Signal() # 开始运行的信号_signal_stop = Signal() # 停止信号_signal_run_now = Signal() # 打破定时器周期立即运行一次""":param target: 需要在子线程中运行的目标函数:param looping: 是周期运行还是一次性任务:param loop_interval: 周期运行的间隙时间:param args: 附带参数"""
2026-04-14 22:19:42
44
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(六)创建通信块和生成上行报文
destArea "AreaVar" 目标区域,存放上行报文的字节。srcAreaVars Array[*] of "AreaVar" 源数据区域,支持多区域输入。的数据格式为:Array[0..5] of "AreaVar"上行报文发送的数据就是位于这些区域的连续字节块。创建FC,命名为:组态上行报文。
2026-04-12 18:21:21
351
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(四)为PLC创建开放式TCP连接
需要注意的是:在创建连接的时候,如果没有客户端连接到PLC,TCON的“BUSY”会一直输出True,直到有客户端连接"DONE"才会置位。调用时会自动创建一个背景DB,将其命名为:上位通信_背景DB。输入实例名称和网络地址,点“start”。会自动创建一个DB块:TCON_DB。这样就将PLC创建为TCP主站。伙伴:未指定、主动建立连接。
2026-04-11 12:00:13
240
原创 S7-1500学习笔记:Array数据类型
创建 ARRAY 变量时,将在方括号内定义小标的限值,并在关键字“of”之后定义数据类型。ARRAY 限值可使用。ARRAY 数据类型的变量表示一个由多个数目固定且数据类型相同元素组成的数据结构。[-2147483648..2147483647] of <数据类型>下限值必须小于或等于上限值。[-32768..32767] of <数据类型>ARRAY[n],例:Array_1[0, 3]ARRAY[下限..上限] of <数据类型>维度,各维度的限值使用逗号进行分隔。除 ARRAY 之外的所有数据类型。
2026-04-05 22:14:12
61
原创 S7-1500学习笔记:用户自定义数据类型(UDT)
项目管理器--PLC--PLC数据类型--添加新数据类型在打开的窗口内定义UDT的变量成员:本例,将UDT 命名为“AreaVar”,由Arrary、DBNum、Offset、byteCount4个变量成员组成。
2026-04-05 17:51:53
788
原创 S7-1500PLC学习笔记:MOVE_BLK、MOVE_BLK_VARIANT、BLKMOV的区别
在 S7‑1500 里,是三种最常用的块移动指令,但定位、用法、限制完全不同。
2026-04-03 17:48:20
419
原创 西门子S7-1500PLC的PEEK/POKE学习笔记
数据类型匹配,比如:PEEK_WORD 对应 2 字节,POKE_DWORD 对应 4 字节,类型错位会导致数据错乱。DB 属性 → 取消 优化的块访问,否则地址不固定,PEEK/POKE 无法定位。16#84 DB 数据块(Data Block)访问 DB 区时:填 DB 号(如 10 → DB10)IO 映射:PI/PQ 直接读写(1500 专属)Area 写错(如用 84 代替 16#84)访问 I/Q/M/PI/PQ 时:必须填 0。
2026-04-03 17:01:52
402
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(二)系统规划
曾多年使用wincc等专业软件进行组态,对HMI(人机交互界面)项目有一定的了解。与前面做过的AI项目demo不同的是,PLC的HMI项目是基于PLC通信的,大部分的操作和更新都是基于PLC变量的读写。
2026-04-01 10:18:24
320
原创 基于QtPy (PySide6) 的PLC-HMI工程项目(一)使用自定义socket协议的基本方法
DEMO展示了创建socket连接,以及断线重连、数据收发、心跳保活的基本方法,同时展示了从自定义格式的数据包中解析出指定类型数据的方法。
2026-03-31 17:26:57
60
原创 使用@property将类方法包装为属性
property→ 定义读取方法(getter),并伪装成属性@属性名.setter→ 定义修改方法(加校验 / 限制)好处:代码简洁、安全可控、符合 Python 优雅的语法风格名字必须一样只有 @property 时,属性是只读的。
2026-03-30 21:00:52
140
原创 QtPy(PySide6),线程的全生命周期管理
import sys# 跟踪qt日志print(s)t.start()btn = QPushButton("线程是否运行中")btn.clicked.connect(lambda :print(f"是否运行:{t.isRunning()}"))btn.show()是否运行:True是否运行:True是否运行:True是否运行:True是否运行:False是否运行:False是否运行:False是否运行:False通过信号判断:import sys# 跟踪qt日志。
2026-03-14 13:43:02
396
原创 QtPy(PySide6),在线程中使用QEventLoop实现低成本待机
创建QObject类,将功能函数包装为QObject类的槽函数,然后使用使用moveToThread移动到QObject类指定线程中运行,使用信号触发功能函数(已包装为QObject类的槽函数),功能函数就会在指定线程内运行。需求:在主线程中启动一个功能函数在指定线程中运行,功能函数运行完成后指定线程并不立即结束,等待运行下一个功能函数。这段代码在线程的run()函数中使用了循环,等待功能函数的调用,由于循环是持续运行的,所以CPU的占用很高。加入了可变参数和停止线程的功能。这是Qt的推荐用法。
2026-03-12 14:56:56
169
原创 PySide6日志系统跨线程通信实战
Qt框架内置了一套完整的日志系统,核心包括qDebug()qInfo()qWarning()qFatal()等函数。这些函数不仅能输出日志信息,更重要的是可以通过自定义日志处理器实现信息的灵活传递。
2026-03-12 07:29:11
245
原创 QtPy(PySide6),日志系统的创建和传递信息
Qt系统的信号槽(Signal & Slot)是其核心的通信机制,专门用于解决对象间和线程间解耦通信的问题,比起传统 GUI 编程中的回调函数,代码更易维护、逻辑更清晰。不过信号槽系统要求专门定义并连接信号和槽函数,而且信号必须是QObject基类对象的属性,那么它的使用范围就要受到限制,比如不想为了一个信号定义一个QObject类,并且需要异步传递一些简单信息,比如文件保存成功、网络连接失败这些,就可以利用QtMsg日志系统来来进行传递。
2026-03-11 11:32:15
331
原创 python,读取图像文件并获取到像素数组的效率测试
读取方法用时(ms)备注使用opencv读取53与python的原生打开方法接近使用pillow读取117最慢使用qt读取110次慢python的原生打开方法打开图像的像素字节53与opencv接近python的原生打开方法打开图像的像素字节,指定读取长度36最快所以,使用python的原生打开方法打开图像的像素字节,并指定长度来读取,是最快的方法。但是这个方法的局限性在于,只对bmp文件最适用,因为bmp文件是逐字节存放像素的原始数据。
2026-03-02 21:26:48
802
原创 YOLO v11 学习记录(九) 把图像使用不同的方式输入yolo进行预测的速度测试
来自相机或网络的Byer-RB字节流数据,是很常见的应用场景,基于以上原理,在读取到Byer-RB字节流数据后直接将其用numpy转换成数组后输入yolo,就可以获取到很快的处理速度。Qt和Pillow打开文件的用时接近,Yolo直读和Opencv打开文件的用时接近,直接打开文件的原始字节并用numpy转换后输入yolo的方式最快(字节流直读)。所以,同样的一个本地图像文件,使用不同的方式打开和转换数据后输入到yolo进行预测,耗时之差达到了将近3倍,从图像文件中直读raw最快。
2026-02-28 19:51:19
461
原创 PyQt:从图像文件或字节流生成QImage的速度测试
一幅从相机获取的3072 * 2048像素的图片,原始像素格式为bayer-rb,将其分别保存为png、bmp、jpg以及raw(直接存储元素的原始bayer-rb字节数据)格式的本地文件,然后使用Qt转换为QImage并显示,统计用时。使用原始图像字节流并使用numpy转换,效率远远比Qt直接读取图像文件高,其中的原因是代码使用了numpy进行像素的矩阵转换,numpy在这部分功能上比Qt强大。附:将相机原始字节流保存为.raw文件的方法。
2026-02-28 12:19:57
350
原创 python,class的__init__()与__call__()两个特殊方法的关系
是 “实例被当作函数调用” 的环节,是对实例功能的扩展,和。没有直接的调用关系,但依赖。
2026-02-26 10:53:41
222
原创 pyside6的多媒体模块:QtMultimedia
qrc文件是Qt的资源文件格式,可将媒体文件嵌入到程序中(编译后无需依赖外部文件)。网络下载的媒体数据、加密文件解密后的内存数据、临时缓存的媒体流、需要频繁重复播放的音视频等。发出指令给后台线程然后立即返回,但此时如果后台还在加载中或播放中,就会导致程序运行异常。将媒体文件读取到内存(字节流),通过 QIODevice播放。直接指定本地文件路径(绝对 / 相对路径),是最简单的播放方式。:部分媒体格式(如大体积视频)从内存播放可能占用较多内存。上面的范例,点击按钮会导致程序停止响应,原因如前述。
2026-02-24 15:13:25
834
原创 Python 编程中变量、函数、类等不同元素的命名规范
核心规则:变量 / 函数用snake_case(小写 + 下划线),类用PascalCase(大驼峰),常量用(全大写 + 下划线);约定规则:私有元素开头加,魔术方法前后加__,模块 / 包名小写简短;通用原则:见名知意、符合 PEP 8 标准,避免关键字和无意义命名。遵循这些规范,代码会更符合 Python 社区的习惯,也更容易被自己和他人理解、维护。
2026-02-23 11:21:32
374
原创 PySide6的QTimeLine详解
这类函数用于定义动画的核心参数,是使用QTimeLine的基础。函数功能说明示例设置动画总时长(单位:毫秒),决定动画执行的快慢# 动画持续 3 秒设置帧的范围(起始帧、结束帧),决定的取值范围# 帧从 0 到 200单独设置起始帧 / 结束帧(替代的拆分写法)是动画过程中最常用的信号,分别返回整数帧值和浮点比例值;监听动画启停 / 暂停状态,finished监听动画正常结束,是控制动画生命周期的核心;监听播放方向变化,适合需要反向播放的动画场景。这些信号覆盖了QTimeLine。
2026-02-12 11:01:31
701
原创 pyside6的时间相关的基础知识学习笔记
的类,简单来说,它的核心作用是在指定时间段内,生成一系列从 0.0 到 1.0(或反向)的数值,你可以基于这些数值来控制 UI 元素的变化(比如移动、缩放、透明度变化等),从而实现平滑的动画效果。的类,它只关注 “时间点”(比如 14:30:25.500),不包含日期、时区或夏令时相关信息,是 Qt 中处理纯时间的基础工具。(仅处理时间,如 15:30:20)的组合体,专门用来表示一个 “具体的时间点”,并提供了丰富的。,它更简洁、开销更小,专门用于在单个对象内处理定时事件,适合简单的定时需求。
2026-02-10 18:22:41
969
原创 PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
是 “退出准备阶段”,此时 Qt 主事件循环还在运行,所有 Qt 核心对象(如QObjectQWidget)都还存活,可正常操作 Qt 组件(比如弹窗提示、保存配置到QSettings:是 “退出收尾阶段”,此时 Qt 主事件循环已结束,部分 Qt 高层对象(如QWidget)可能已销毁,不建议操作 Qt 组件,仅适合纯 C 层面的清理(如释放全局内存、关闭 C 语言打开的文件句柄)。执行时机是核心在主循环退出前(Qt 对象存活),在主循环退出后(Qt 对象可能已销毁);使用场景区分。
2026-02-07 16:29:49
913
原创 PySide6从0开始学习的笔记(二十七) 日志管理
logging是 Python内置的日志模块,这个模块是 Python 官方提供的进行程序日志记录的核心工具。logging是Python内置的日志模块,可用于替代print()做专业的日志记录;该模块支持日志分级、自定义格式、多输出位置,是生产环境程序必备的调试 / 监控工具;
2026-02-05 10:47:34
1052
原创 PySide6从0开始学习的笔记(二十六) 重写Qt窗口对象的事件(QEvent)处理方法
在 PySide6 中,所有的窗口部件(QWidget及其子类)都继承了事件处理机制(如鼠标右键、滚轮、窗口打开 / 关闭事件),可以通过重写这些事件来实现自定义功能,比如右键菜单、滚轮缩放等。要实现以上功能,核心是。事件方法名通常以Event结尾(如wheelEvent),我们只需在自定义部件类中重新定义这些方法即可。
2026-01-31 18:56:35
702
原创 PySide6从0开始学习的笔记(二十五) Qt对象的生命周期和及时销毁
正如之前学习过的,当Qt的窗口对象被关闭(close())之后,它并没有在内存中消失,只是暂时隐藏起来不显示,当再次执行show()就会显示。对于一些短时间运行的简单小应用,这种重复生成并且不被销毁的对象,不会对系统资源有多大的消耗,但如果是一个7*24h运行,频繁操作的应用,比如工业视觉检测、scada项目等,就不得不重视对象的生命周期,对于不再有用的对象要及时销毁,以免对系统资源带来浪费。但是,只有点击"关闭本窗口按钮“关闭窗口,才能销毁,如果使用窗口右上角自带的关闭按钮关闭窗口,仍然不会被销毁。
2026-01-31 12:28:35
359
原创 海康 MV 相机几种Bayer RG像素格式的处理
RG10 核心特征:10bit 有效数据(0~1023),以 uint16 存储,Bayer 排列为 RGGB,小端存储;转换关键步骤:uint16 数组转换 → 10bit 归一化到 8bit → OpenCV 的 BAYER_RG2RGB 转换;避坑点:确认 Bayer 排列(颜色异常时换 OpenCV 的 Bayer 转换枚举)、端序(小端)、分辨率匹配。如果 RG10 数据转换后出现颜色偏色、画面乱码等问题,优先核对 Bayer 排列方式(换。
2026-01-29 11:01:34
996
原创 海康Mv相机,在pyqt中使用GetImageBuffer的方法获取数据的流程和使用方法
3. 把字节流转换为以图像的宽和高为参数的二维数组numpy array,得到:image_array,现在的像素格式仍然是Bayer RG8.4. 把像素阵列转换到RGB和BGR格式,得到:rgb_image,格式为RGB;1. 从缓存中获取一帧图像数据(海康相机默认的像素格式为Bayer RG8) ,得到:stOutFrame。得到:pix_map。5. 将RGB的像素阵列转换为Qt的QImage对象,得到:q_img。2. 拷贝帧图像数据的字节流,得到:buf_frame_bytes。
2026-01-26 17:59:26
124
原创 PySide6从0开始学习的笔记(二十四) QImage
QImage 是 Qt 框架中用于的核心类,主要负责图像的加载、存储、像素级操作及格式转换,是 Qt 图形处理的基础组件之一。
2026-01-26 17:56:12
1186
原创 PySide6/PyQt5,QImage 和 QPixmap 的关系与区别
核心定位:QImage 负责 “处理图像数据”,QPixmap 负责 “显示图像”,两者是 “处理 - 显示” 的协作关系。线程安全:QImage 可在非主线程使用,QPixmap 仅能在 GUI 主线程使用。转换方式:通过和实现双向转换,是 PySide6 中图像编程的核心操作。
2026-01-25 11:41:37
368
试试用pyqt做一个上位机软件,但愿不会烂尾(七)配套资源
2023-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
4