Qt状态机

基本概念

  • QStateMachine:管理一组状态和转换的状态机。
  • QState:表示状态机中的一个状态。
  • QSignalTransition:根据发射的信号触发状态之间的转换。

示例逻辑

假设您有三个主要状态:值守(Daemon)、做样(Sampling)、异常处理(ErrorHandling)。我们将创建一个状态机来管理这些状态的转换。

步骤 1:定义状态机和状态

// 创建状态机
QStateMachine* machine = new QStateMachine(this);// 创建状态
QState* daemonState = new QState(machine);
QState* samplingState = new QState(machine);
QState* errorHandlingState = new QState(machine);// 设置状态对象名,便于调试
daemonState->setObjectName("Daemon");
samplingState->setObjectName("Sampling");
errorHandlingState->setObjectName("ErrorHandling");

步骤 2:配置状态转换

// 值守状态转到做样状态
daemonState->addTransition(this, SIGNAL(startSampling()), samplingState);// 做样状态结束后返回值守状态
samplingState->addTransition(this, SIGNAL(samplingFinished()), daemonState);// 从任意状态转到异常处理状态
daemonState->addTransition(this, SIGNAL(errorOccurred()), errorHandlingState);
samplingState->addTransition(this, SIGNAL(errorOccurred()), errorHandlingState);// 异常处理结束后,返回值守状态
errorHandlingState->addTransition(this, SIGNAL(errorResolved()), daemonState);

步骤 3:为状态添加入口和退出动作

// 当进入做样状态
QObject::connect(samplingState, &QState::entered, [this]() {qDebug() << "Entering Sampling State";// 这里可以放置做样的逻辑
});// 当离开做样状态
QObject::connect(samplingState, &QState::exited, [this]() {qDebug() << "Exiting Sampling State";
});// 对于其他状态也可以进行类似的操作

步骤 4:启动状态机

// 设置初始状态
machine->setInitialState(daemonState);// 启动状态机
machine->start();

使用信号和槽进行状态转换

假设您有函数来处理具体的操作,比如开始做样和处理异常,您可以在这些函数中发射上面定义的信号来触发状态转换。

小结

  • 初始化:创建状态机和状态,然后定义状态间的转换。
  • 动作:为每个状态的进入和退出定义动作。
  • 转换:基于事件(信号)触发状态转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 安卓连接wifi成功,提示消息为失败

解决方案&#xff1a; forceNewApi: true, uni.connectWifi({forceNewApi: true,SSID: this.SSID,password: this.password,success: (res) > {console.log(res, "连接成功");},fail: (err) > {console.log(err);},}); 加上这话就返回正常数据了

版本控制工具Git的使用

1、Git的基本概念和使用 1、Git是什么? ● Git: 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 ● GitHub: 全球最大的面向开源及私有软件项目的托管平台,免费注册并且可以免费托管开源代码。 ● GitLab:与GitHub类似&a…

二分查找的边界问题是怎么产生的?

总结&#xff1a;二分查找的目标有两个&#xff0c;一个是左区件的右边界&#xff0c;一个是右区间的左边界 如何去理解二分的过程&#xff1f; 如果要查找的是左区间的右边界&#xff1a; 可以将[l, r]理解一个集合&#xff0c;这个集合范围内的数都有可能是最后需要得到的…

打不动的蓝桥杯

打不动的蓝桥杯 2024-4-13 今天的蓝桥杯打得很烂&#xff0c;8题写了4题&#xff0c;100分可能有20来分吧。我写了的题好像都很简单&#xff0c;没什么竞争力。又觉得我知道的东西不止这么点&#xff0c;没能发挥。 这次比赛&#xff0c;首先&#xff0c;有强烈的陌生感。pytho…

【C++核心】C++中的对象

C中的对象 一、对象的初始化和清理1. 构造函数和析构函数1.1 构造函数简介1.2 构造函数1.3 析构函数1.4 代码样例1.5 默认实现 2. 构造函数的分类及调用2.1 构造函数的分类2.2 构造函数的调用方式2.3 匿名函数 3. 拷贝构造函数调用时机4. 构造函数的规则5. 深拷贝和浅拷贝6. 初…

ChatGLM3初体验

mac本地化部署ChatGLM3 写在前面环境准备1. python环境2. 安装第三方依赖torch3.下载模型 代码准备1.clone代码 run效果 写在前面 建议直接去看官方文档 https://github.com/THUDM/ChatGLM3?tabreadme-ov-file 环境准备 1. python环境 python -V ## 3.11.42. 安装第三方依…

标注平台工作流:如何提高训练数据质量与管理效率

世界发展日益依托数据的驱动&#xff0c;企业发现&#xff0c;管理不断增长的数据集却愈发困难。数据标注是诸多行业的一个关键过程&#xff0c;其中包括机器学习、计算机视觉和自然语言处理。对于大型语言模型&#xff08;LLM&#xff09;来说尤是如此&#xff0c;大型语言模型…

前端面试问题汇总 - Vue篇

1. Vue 的生命周期有哪些&#xff0c;每个阶段分别做什么操作&#xff1f; beforeCreate&#xff1a; 在实例初始化之后、数据观测和事件配置之前被调用。此时数据对象 data 和事件&#xff08;methods&#xff09;都还未初始化。一般不在此阶段进行数据初始化和 DOM 操作。cre…

为什么我们应该切换到Rust

What is RUST? 什么是Rust&#xff1f; Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C, but it provides memory safety without usi…

[大模型]Yi-6B-chat WebDemo 部署

Yi-6B-chat WebDemo 部署 Yi 介绍 由60亿个参数组成的高级语言模型 Yi LLM。为了促进研究&#xff0c;Yi 已经为研究社区开放了Yi LLM 6B/34B Base 和 Yi LLM 6B/34B Chat。 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–…

leecode438 | 找到所有字符串中的异位词

题意大致是&#xff0c;给定两个字符串&#xff0c;s 和 p 其中 要在s 中找到由p的元素组成的子字符串&#xff0c;记录子字符串首地址 class Solution { public:vector<int> findAnagrams(string s, string p) {int m s.size(), n p.size();if(m < n)return {};vec…

vue-router 原理【详解】hash模式 vs H5 history 模式

hash 模式 【推荐】 路由效果 在不刷新页面的前提下&#xff0c;根据 URL 中的 hash 值&#xff0c;渲染对应的页面 http://test.com/#/login 登录页http://test.com/#/index 首页 核心API – window.onhashchange 监听 hash 的变化&#xff0c;触发视图更新 window.onhas…

谷歌关键词优化全攻略提高曝光率-华媒舍

现如今&#xff0c;互联网已成为信息获取的主要渠道&#xff0c;而搜索引擎则是人们寻找信息的首选工具之一。其中&#xff0c;谷歌作为全球最大的搜索引擎&#xff0c;其搜索结果的排名直接影响着网站的曝光率和流量。了解并掌握谷歌关键词优化的技巧&#xff0c;成为提升网站…

Vue项目打包:禁止生成sourceMap文件

Vue项目在打包过程中&#xff0c;默认会生成sourceMap文件。 sourceMap的主要作用是让打包后的文件像未压缩的代码一样&#xff0c;方便调试和定位错误。然而&#xff0c;在生产环境中我们通常不需要这些文件&#xff0c;因为它们会增加应用程序的体积。 可以在vue.config.js…

MySQL-多表查询:多表查询分类、SQL99语法实现多表查询、UNION的使用、7种SQL JOINS的实现、SQL99语法新特性、多表查询SQL练习

多表查询 1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. 多表查询分类讲解分类1&#xff1a;等值连接 vs 非等值连接等值连接非等值连接 分类2&#xff1a;自连接 vs 非自连接分类3&#xff1a;内连接…

团结引擎+OpenHarmony 1配置篇

团结引擎OpenHarmony 1 配置篇 app团结鸿蒙化第一课一 DevEco Studio 下载安装二 团结引擎三 出包 app团结鸿蒙化第一课 1 团结引擎配置2 DevEco Studio 配置 一 DevEco Studio 下载安装 申请开发者套件 1 注册华为账号 签署协议 官网 2 认真填写 DevEco Studio 开发套件申请…

高清4路HDMI编码器JR-3214HD

产品简介&#xff1a; JR-3214HD四路高清HDMI编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持4路高清HDMI音视频采集功能&#xff0c;4路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质…

预约系统的使用

预约系统的使用 目录概述需求&#xff1a; 设计思路实现思路分析1.用户年规则 在 预约系统中的使用流程 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wa…

【LeetCode热题100】【二叉树】路径总和 III

题目链接&#xff1a;437. 路径总和 III - 力扣&#xff08;LeetCode&#xff09; 要从上到下找一条路径的和最简单的方法是遍历每个节点&#xff0c;然后从每个节点往下累加看看和对不对 这样是O(n&#xff09;的时间复杂度 可以计算一条路径上的前缀和方法&#xff0c;这样…

[图像处理] MFC OnMouseMove()绘制ROI矩形时的闪烁问题

文章目录 问题对策代码完整工程 结果使用Picture控件的RedrawWindow()的效果使用Dialog的RedrawWindow()的效果使用Picture控件的RedrawWindow()&#xff0c;ROI绘制到图像外的效果 结论 问题 最近想通过业余时间&#xff0c;写一个简单的图像处理软件&#xff0c;一点点学习图…