- 博客(269)
- 收藏
- 关注
原创 QT开发汇总(更新2025.12.09)
摘要:本文汇总了PySide6与QML结合的开发教程系列文章,涵盖基础入门、信号槽交互和多线程处理等内容。信号槽部分详细介绍了按钮触发、参数传递、返回值处理等9种交互场景;多线程章节包含QThread基础使用、生命周期管理以及线程池优化等6个实践案例;最后还提供了串口开发的入门指南。该系列适合想要掌握PySide6+QML跨平台开发的Python工程师参考学习。
2025-11-12 21:23:19
633
原创 SimpleFOC学习笔记汇总(2025.10.28更新)
在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代,对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来,接着结合实践与理论才能真正掌握技术。未来的一段很长的时间里,将分享simpleFOC学习的笔记。通过分享笔记的方式,进一步提高自己对FOC的理解。大家互相学习,共同进步吧。
2025-01-14 23:56:44
7818
6
原创 嵌入式CANopen协议从入门到落地产品(更新2023.10.18)
一、前言我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅。光看CANopen协议的理论是很枯燥的,而且无论看多少遍都无法掌握CANopen协议。我认为掌握CANopen协议的唯一方法是自己设计一个CANopen从站。以前我在电气研发的时候,看了很多遍讲CANopen协议的pdf与书籍,最后也没看懂CANopen是什么东西。害的我在工作上一碰到CANopen协议就害怕,觉得是一个非常复杂的东西,一般人根本学不会。命运的转折点又来了,上一年(2
2021-07-28 21:16:36
17808
16
原创 STM32+CubeMX开发笔记汇总(更新2025.11.18)
只会用HAL库,不会完全不理会寄存器,只能算是入门。别扯寄存器开发周期长什么的,移植会很困难。在高手面前,这些都是问题。在高手看来,怎样提高效率与减少空间才值得品味。
2021-07-13 21:47:53
7588
3
原创 嵌入式实时操作系统RTX5快速入门 (完结)
一、前言在实际工作上使用过ucosIII与FreeRTOS,对它们俩的API都较为熟悉,那么当有新的项目时,直接二选一就好了。为什么非得去折腾另一款新的RTOS(RTX5)?原因是使用RTOS会影响系统的执行效率(ISR切换线程,线程切换线程都需要时间)。但是,RTX5在这方面做得不错,这是我非得去折腾一个新的RTOS的原因。RTX5的简单介绍可以查看安富莱的总结:第3章 RTX5操作系统介绍非得折腾去RTX5的理由:实时性强。以低的中断延迟执行高速实时操作(对于M3/M4/M7内核可以实现零中断延
2021-06-09 23:01:16
31435
22
原创 PySide6 + QML - Charts06 - 鼠标悬停显示坐标
本文介绍了如何使用Qt Quick实现一个实时数据曲线图,并添加鼠标悬停显示坐标功能。主要内容包括: 创建ChartView图表容器,设置X/Y轴和LineSeries曲线 通过Timer定时生成随机数据点,实现实时数据更新效果 利用LineSeries.onHovered事件处理鼠标悬停,使用mapToPosition转换坐标 自定义Tooltip矩形框显示当前坐标值 添加控制按钮实现开始/暂停、清除数据和调整更新频率功能 代码结构清晰,通过属性绑定和信号处理实现交互效果,适合作为Qt图表交互开发的参考示
2025-12-09 21:10:49
927
原创 PySide6 + QML - Charts07 - 使用checkbox选择需要显示的曲线
摘要 本文介绍了一个使用Qt Quick和Qt Charts实现的动态曲线图应用,支持通过复选框控制不同曲线的显示/隐藏。主要功能包括: 同时显示两条动态曲线(正弦波和余弦波),并添加随机噪声模拟真实数据 通过复选框组件控制每条曲线的可见性 实现动态数据更新,自动限制显示数据点数量 添加鼠标悬停Tooltip显示当前数据点坐标 包含开始/暂停按钮控制数据更新 工程代码已开源在GitHub和Gitee平台,可作为Qt图表开发的参考实现。
2025-12-09 21:07:32
756
原创 PySide6 + QML - Charts05 - 动态滚动线性图
ApplicationWindow 主窗口。ColumnLayout 垂直布局。ChartView 图表容器。RowLayout 控制区域。ValueAxis X轴。ValueAxis Y轴。调整 interval。控制 running。更新 min max。
2025-12-05 08:46:06
930
原创 PySide6 + QML - Charts04 - 动态添加数据
本文介绍了如何使用Qt Charts实现动态添加和清除数据点的功能。主要内容包括: 通过dataSeries.append(x,y)方法动态添加坐标点到线性图中 使用dataSeries.clear()清除所有数据点 通过dataSeries.count属性获取当前数据点数量 实现了自动扩展X轴范围的功能 提供了添加随机点和清除数据的按钮操作 项目地址: GitHub: https://github.com/q164129345/myPyside6_QML/tree/main/charts04_dynami
2025-12-05 08:43:50
655
原创 PySide6 + QML - Charts03 - 同时绘制多条曲线
摘要 本文介绍了在Qt QML中实现多条曲线图表显示的关键方法。通过创建一个共享的自定义坐标轴系统(ValueAxis),确保三条不同颜色和名称的曲线(温度、湿度、气压)能够正确显示在同一图表中。代码展示了如何定义X轴(0-5)和Y轴(0-70)的范围,并将三条LineSeries绑定到相同的坐标轴上。如果不使用共享坐标轴,每条曲线会创建独立坐标轴,导致其他曲线无法正常显示。该实现使用QtCharts模块,提供了简洁的QML语法和可视化效果。
2025-12-05 08:41:43
939
原创 PySide6 + QML - Charts02 - 自定义曲线颜色和粗细
本文介绍了一个基于PySide6和QML的图表可视化项目,展示了如何使用不同大小和颜色的线条绘制数据。项目提供了GitHub和Gitee的代码仓库链接,包含一个名为"Main.qml"的QML文件,该文件实现了图表渲染功能。项目演示了如何通过QML创建带有自定义线条样式(包括尺寸和颜色变化)的数据可视化图表。摘要中提到的图片显示了该QML程序运行时的界面截图。
2025-11-28 09:15:22
158
原创 PySide6 + QML - Charts01 - 我的第一条曲线
本文介绍了Qt Charts控件的入门学习,基于官方例程展示了一个简单的折线图实现。通过ChartView组件创建图表,演示了基础数据可视化功能。提供了工程代码的GitHub和Gitee仓库链接,方便读者获取完整示例。文章配有动态效果图,直观展示了图表交互效果,为初学者快速上手Qt Charts提供了实用参考。
2025-11-28 09:13:23
156
原创 PySide6 + QML - 调试日志02 - 自定义 qInstallMessageHandler 实现分级日志输出,且解决中文乱码
本文介绍了一种改进的Qt日志处理方案,解决了中文乱码问题并保留了日志等级分类。相比之前的简单print()重定向方案,新方案通过自定义qt_message_handler函数实现了以下优化: 区分不同日志级别(DEBUG/INFO/WARN/ERROR/FATAL) 保留上下文信息(文件名、行号) 正确格式化输出路径 解决中文编码问题 方案使用Python字典映射日志级别,并采用f-string格式化输出,最终通过print()安全输出到终端。实际效果显示日志按等级清晰区分,中文显示正常。代码已开源在Git
2025-11-26 14:41:36
616
原创 PySide6 + QML - 调试日志01 -告别打印log中文乱码,快速且简单地解决
摘要 QML中使用console.log打印中文时出现乱码,原因是QML输出UTF-8编码,而Windows终端默认使用GBK/CP936编码。通过在Python中调用qInstallMessageHandler模块,将日志消息重定向到print()函数,可自动完成编码转换,解决乱码问题。该方法无需修改QML代码,仅需在Python主文件中添加一行拦截代码即可实现兼容性输出。 关键词:QML乱码、UTF-8转GBK、qInstallMessageHandler、日志编码转换
2025-11-24 20:46:19
660
原创 PySide6 + QML - QSerialPort03 - 串口的发送与接收,一个能用的串口调试助手
本文介绍了一个基于PySide6和QML的串口调试助手实现。主要内容包括: 使用QSerialPort类实现串口通信功能 提供串口扫描、打开/关闭连接等基础操作 支持ASCII和HEX两种数据格式的收发 通过信号槽机制实现前端QML界面与后端Python逻辑的交互 包含错误处理和状态通知功能 项目代码已开源在GitHub和Gitee平台,可作为串口通信开发的参考实现。该示例展示了如何将PySide6的串口功能与QML界面相结合,构建实用的串口调试工具。
2025-11-21 09:25:11
677
原创 PySide6 + QML - QSerialPort02 - 串口的打开与关闭
本文介绍了使用PySide6的QSerialPort模块实现串口打开与关闭功能。主要内容包括: 创建SerialBackend类管理串口操作 提供扫描串口、打开串口和关闭串口的方法 使用信号机制与前端通信(portsListChanged、connectionStatusChanged、errorOccurred) 关键功能实现 扫描所有可用COM端口并过滤非COM设备 配置串口参数(波特率、数据位、校验位等) 处理串口连接状态和错误信息 工程特点 采用信号槽机制实现前后端解耦 提供详细的日志输出 完整的错
2025-11-18 11:55:41
876
原创 STM32F103_Bootloader程序开发16 - 记得喂狗!!!从下载区搬运固件到App区的时候。
摘要: 在开发FOC电机控制板bootloader的OTA功能时,发现将固件切片大小从256改为512后升级失败率显著增加。问题表现为上位机发送完固件后无响应,Flash中下载区固件完整但App区不完整。最终定位原因是OP_Flash_Copy()函数搬运固件时间过长导致看门狗超时重启。由于控制板无串口日志,排查耗时较长。解决方案:在搬运每个切片后及时喂狗。项目已开源,地址见Gitee/GitHub(150字) (注:实际字数149,含标点)
2025-11-18 11:50:41
258
原创 PySide6 + QML - QSerialPort01 - 扫描操作系统上有效的串口
摘要:本文介绍了使用PySide6开发串口通信模块的基础方法,重点讲解了如何扫描操作系统上有效的串口信息。通过QSerialPortInfo类获取串口列表,并展示了获取串口名称和描述信息的代码实现。文章包含命令行测试和Python代码示例,演示了如何将扫描到的串口信息通过信号机制传递到QML界面。该模块作为上位机开发的核心组件,为后续实现稳定高效的串口通信功能奠定了基础。
2025-11-12 21:13:09
870
原创 PySide6 + QML - 多线程06 - 使用QThreadPoll管理多线程(并行机制)的优化版本
本文介绍了一种简化版的线程池实现方法,借鉴QtConcurrent思想,使用QRunnable和lambda表达式来简化后台任务的执行。与标准实现相比,该方法具有三大优势: 无需为每个任务创建单独的QRunnable类 省去了WorkerSignals辅助类 通过lambda表达式实现极简的任务提交 关键实现包括: SimpleRunnable通用包装器,支持执行任意函数 通过Backend类的resultReady信号实现线程间通信 使用lambda tid=i捕获变量保证任务ID正确传递 这种方法在保持
2025-11-11 18:27:56
669
原创 STM32 - Embedded IDE - GCC - 编译器设置的最佳方案
有些同学刚从Keil或者IAR等开发环境切换到VScode + GCC开发环境时,不知道构建器怎样设置最合适。所谓最合适就是代码体积更小,降低堆栈的要求,提高代码的执行效率等等。
2025-11-10 19:02:10
448
2
原创 PySide6 + QML - 多线程05 - 使用QThreadPool管理多线程(并行机制)
本文介绍了Qt中三种线程模型的应用场景和实现方式: 单线程串行模型:使用moveToThread将工作对象移到单独线程,所有任务通过事件队列顺序处理 多线程并行模型:为每个长期任务创建专属线程,实现真正的并行执行 线程池模型:通过QThreadPool管理复用线程,高效处理大量短期任务 重点演示了线程池的实现: 通过继承QRunnable创建轻量级任务 使用WorkerSignals辅助类实现信号传递 QThreadPool自动管理线程调度 设置任务自动删除(autoDelete=True) 可控制最大并发
2025-10-30 15:46:18
1166
原创 PySide6 + QML - 多线程04 - 用QThread创建多个独立线程并行运行
本文介绍了如何在PySide6中实现多线程并行任务。通过子类化QThread创建独立线程Worker,每个线程执行计数循环任务,并通过信号机制与主线程通信。Backend类管理多个Worker线程,将计数结果通过属性暴露给QML界面。关键点包括:1) Worker线程通过run()方法实现循环逻辑;2) 使用msleep()安全暂停线程;3) 通过信号跨线程通信;4) 提供clean_up方法安全停止所有线程。这种架构适合需要独立后台循环任务的场景,保证了主线程的流畅性。
2025-10-29 19:07:29
616
原创 PySide6 + QML - 多线程03 - 一个线程跑多个任务(串行机制)
本文介绍了两种线程生命周期管理模式:短任务模式(thread02)和长驻模式(thread03)。短任务模式适用于一次性任务,特点是执行后立即销毁线程,适合间隔时间长、执行时间久的任务;而长驻模式则创建常驻线程,适用于持续监听、高频任务或多任务排队处理,资源随程序退出时统一清理。文中提供了具体代码示例,包括Worker类处理任务、Backend类管理线程生命周期,以及QML界面设计。通过Qt的aboutToQuit信号实现安全资源清理,确保线程正确退出和对象删除。
2025-10-29 10:37:28
383
原创 无刷电机控制 - 拆解三相无刷电机5550 + 霍尔传感器检测转子位置
本文通过拆解一台三相无刷电机,详细分析了其硬件结构。首先展示了转子与定子的拆解过程,指出该电机采用9槽绕组和6极转子结构(极对数为3)。重点解释了霍尔传感器的安装角度问题:虽然厂家标注120度电角度,但实际机械角度为40度,这是因为电角度等于机械角度乘以极对数。文章强调,随着电机极对数的增加,霍尔传感器的机械安装角度会相应减小,这一原理对理解无刷电机控制至关重要。
2025-10-28 14:29:06
457
原创 PySide6 + QML - 多线程02 - QThread 生命周期与安全退出
【线程安全退出关键点总结】 Worker独立于线程 Worker对象通过moveToThread()托管给QThread Worker的槽函数在QThread上下文执行,但Worker本身不是线程 安全退出三要素 标志位控制:_is_running实现可控停止 资源清理:quit()+wait()+deleteLater()三步走 异常处理:处理应用中途退出场景 生命周期管理 任务完成自动清理(finished信号触发) 强制退出保护(aboutToQuit信号) 防止二次操作(is_task_runnin
2025-10-28 13:56:36
1331
原创 PySide6 + QML - 多线程01 - QThread 基础(子线程执行耗时任务)
本文将介绍如何使用PySide6实现多线程任务处理,保持UI流畅响应。通过QThread+Worker模式,将耗时任务放入子线程执行,避免阻塞主线程。核心代码展示了如何创建Worker对象并迁移到子线程,通过信号机制安全传递结果。当任务完成时,自动触发线程退出和资源清理。示例包含Python后端代码和QML前端界面代码,实现了点击按钮启动后台任务并显示结果的功能。这种模式是Qt中处理耗时任务的常见解决方案,能有效提升应用程序的用户体验。
2025-09-23 21:44:37
1251
原创 Pyside6 + QML - 信号与槽09 - 动态连接与断开连接
文章摘要 本示例演示了PySide6中信号与槽的动态绑定与解绑功能。通过connect()和disconnect()方法,实现了按钮点击事件的动态控制:在调试模式下可同时更新计数和打印日志,在正式模式下只更新计数。后端代码通过try-except处理重复连接/解绑的异常,QML界面提供三个按钮分别触发信号、启用和禁用打印功能。这种机制为程序运行时的功能切换提供了灵活的实现方式,完整代码已开源在GitHub和Gitee平台。
2025-09-22 21:22:45
472
原创 PySide6 + QML - 信号与槽08 - 一个函数被多个信号触发(带参数)
本文介绍了如何在PySide6中实现带参数的信号与槽机制,使一个Python槽函数能响应多个QML信号并处理不同参数。Python后端定义了两个信号signalA和signalB,均携带字符串和整型参数。QML界面包含两个按钮,点击时分别触发对应信号并传递按钮标识和点击次数参数。Python槽函数slot_handle_event统一处理这两个信号,根据参数区分信号源并记录点击次数。该方案实现了界面与逻辑的分离,同时保持了参数传递的灵活性。文末提供了完整的GitHub/Gitee工程链接。
2025-09-22 21:21:25
413
原创 PySide6 + QML - 信号与槽07 - 一个函数被多个信号触发
本文介绍了PySide6中一个槽函数同时响应多个信号的实现方法。通过定义两个信号signalA和signalB,并将它们连接到同一个槽函数slot_handle_event,实现了不同事件触发相同处理逻辑的功能。QML界面提供了两个按钮,分别触发这两个信号,演示了如何在前端调用Python后端的信号函数。这种模式适用于需要统一处理多个事件的场景,如日志记录或控制命令。文章提供了完整的工程代码链接,包括GitHub和Gitee上的项目地址。
2025-09-22 21:19:26
471
原创 PySide6 + QML - 信号与槽06 - 一个信号触发多个函数
本文介绍了在PySide6/QML中实现一个信号连接多个槽函数的方法。通过Python定义信号buttonClicked,并将其同时连接到print_message和update_counter两个函数,实现点击按钮时同时触发日志打印和计数器更新功能。QML界面通过按钮的onClicked事件直接触发Python信号,展示了信号与槽的多路复用机制。文章提供了完整的代码示例和工程链接,适合学习PySide6信号槽机制的中级应用场景。
2025-09-22 21:17:20
401
原创 PySide6 + QML - 信号与槽05 - 使用 @Property实现 Python与QML的双向绑定
本文介绍了在PySide6中如何使用@Property实现QML与Python的双向数据绑定。通过定义一个继承自QObject的Backend类,使用@Property装饰器将Python属性暴露给QML,并绑定信号通知机制。当QML访问或修改这些属性时,会自动调用Python的getter/setter方法,实现数据同步更新。示例展示了计数器的双向绑定效果,QML界面可以读写Python属性,而Python属性变化也会自动更新UI。这种方法比信号槽机制更自然简洁,适合需要变量绑定的场景。
2025-09-18 20:37:11
1120
原创 PySide6 + QML - 信号与槽04 - Python 主动发射信号驱动 QML UI
摘要:Python与QML的双向信号交互 本文演示了Python与QML实现双向交互的技术方案,重点展示了Python主动发送信号驱动QML界面更新的方法。通过定义messageChanged = Signal(str)信号和使用QTimer定时器,Python端每秒自动发送更新消息。QML端通过Connections元素监听信号,遵循Qt框架约定的命名规则onMessageChanged实现自动响应。这种机制实现了从Python到QML的单向数据推送,结合原有的QML调用Python功能,构建了完整的双向
2025-09-18 15:13:02
1276
原创 PySide6 + QML - 信号与槽03 - QML调用 Python 方法并接收返回值
QML与Python双向交互实现 本文介绍了如何使用PySide6实现QML与Python的双向交互,包括参数传递和结果返回。核心代码展示了一个完整的闭环流程:QML界面调用Python方法并显示返回结果。 关键实现点: Python端通过继承QObject并添加@Slot装饰器创建可调用方法 使用setContextProperty将Python对象注册到QML环境 QML通过绑定事件调用Python方法并处理返回值 应用场景: 界面逻辑与业务逻辑分离 复杂计算与界面渲染的解耦 保留Python强大功能的
2025-09-17 20:32:19
1016
原创 PySide6 + QML - 信号与槽02 - QML Button向 Python 传递参数
本文展示了如何实现QML前端与Python后端的交互,通过信号槽机制实现按钮点击事件的参数传递。关键点包括: Python端创建Backend类继承QObject,使用@Slot装饰器定义接收字符串参数的槽函数 QML中两个按钮分别绑定到不同的Python槽函数,点击时传递特定字符串 演示了基本交互流程:QML按钮clicked信号→调用Python函数→控制台输出 补充说明了@Slot支持的各种参数类型转换关系,包括int、float、bool、str、list、dict等 提供了完整工程代码地址,便于参
2025-09-17 20:29:57
955
原创 PySide6 + QML - 信号与槽01 - Button 触发 Python 类方法
本文介绍了一个简单的PySide6与QML交互框架。通过实例演示了如何实现点击QML按钮调用Python后端函数的功能。核心代码包括: Python后端类(Backend)继承QObject,使用@Slot()装饰器标记可调用方法 将后端对象注册到QML环境 QML中通过onClicked事件直接调用注册的后端方法 该框架展示了PySide6和QML前后端交互的基本模式,代码简洁清晰,适合作为入门示例。完整代码已上传至GitHub和Gitee平台。
2025-09-17 20:27:46
534
原创 PySide6 + QML - 从官方的例程开始
本文介绍了如何创建第一个Qt Quick程序(Pyside6)。项目结构包含一个Python主文件(main.py)和Example模块(包含Main.qml界面定义文件和qmldir模块描述文件)。QML文件定义了一个带按钮的窗口,点击按钮会随机显示不同语言的"Hello World"。qmldir文件相当于模块目录索引,指定模块名称和组件对应关系。Python代码通过QQmlApplicationEngine加载QML模块,其中engine.addImportPath添加模块路径,e
2025-09-17 20:19:22
1001
原创 STM32 - Embedded IDE - GCC - rt_thread_nano的终端msh>不工作的排查与解决
RT-Thread的MSH终端正常工作依赖链接脚本中的关键段定义。FSymTab和VSymTab段保存了shell命令的符号表,而.rti_fn*段则处理系统自动初始化函数。当链接脚本缺失这些段定义时,会导致符号表丢失和初始化失败,表现为MSH终端无法识别命令。解决方法是在链接脚本中明确保留这些段,并定义相应的边界符号(如__fsymtab_start/end),确保RT-Thread能正确加载命令和完成初始化。这两部分缺一不可,共同保障了RT-Thread系统的正常运行。
2025-09-08 20:16:49
729
原创 STM32 - Embedded IDE - GCC - GCC 环境下rt_thread nano3.13调度器不工作的排查与解决
本文分析了RT-Thread在不同编译器下的入口处理机制差异。在Keil编译器中,RT-Thread使用$Sub$$main和$Super$$main符号重定向透明地拦截main函数调用,先执行系统初始化。而在GCC编译器下,由于缺乏类似功能,RT-Thread定义了entry()作为新入口点,必须修改启动文件将bl main改为bl entry才能确保系统先完成rtthread_startup()初始化。这种差异反映了不同编译器的设计理念,RT-Thread通过适配确保了系统服务在用户代码执行前完成必要初
2025-09-08 10:30:40
991
原创 STM32 - Embedded IDE - GCC - 解决 RT-Thread Nano 3.1.3 在 ARM GCC 14.3 编译器中的 Thumb-2 条件指令错误
本文介绍了在使用CubeMX6.5生成HAL库代码并移植RT-Thread Nano 3.1.3版本时遇到的编译错误问题。错误源于ARM编译器14.3.1版本对Thumb-2指令集的严格要求,需要在条件执行指令前添加IT块。作者通过在context_gcc.S文件中四个关键位置添加IT指令(如IT EQ等),成功解决了VSTMDBEQ、MOVEQ等条件指令的编译问题。最终修改后的代码能够顺利通过编译。该案例展示了处理ARM编译器版本兼容性问题时的典型解决方案。
2025-09-05 11:54:53
364
原创 STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践
本文总结了STM32项目从Keil迁移到GCC开发环境时遇到的几个关键问题及解决方案。主要问题包括:1)EIDE插件与J-Link+RTT日志方案不兼容,改为USART2输出日志;2)GCC编译的Bootloader跳转APP时出现HardFault故障,通过注释SCB->VTOR设置解决。文章还提供了OTA升级流程图和项目开源地址,分析了不同编译器导致行为差异的原因(中断时机与向量表处理的区别)。
2025-09-04 19:35:32
1244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅