当前位置: 首页 > news >正文

Qt:QStateMachine 状态机框架

添加模块

CMake find_package(Qt6 REQUIRED COMPONENTS StateMachine)
target_link_libraries(mytarget PRIVATE Qt6::StateMachine)
qmake QT += statemachine

 

了解

  • 分层有限状态机(分层即 有主状态机 且 每种状态下可能有子状态机)
  • 执行算法基于状态图 XML(SCXML)算法。

知识点

  • 状态类 QAbstractState
    • QState 基础状态
    • QHistoryState 执行完任务后自动返回上一个状态
    • QFinalState 结束状态
  • 状态转换类 QAbstractTransition
    • 无信号,立即转移:addTransition(QAbstractState *target)
    • 触发了信号才会转移:
      addTransition(const QObject *sender, PointerToMemberFunction signal,QAbstractState *target);
  • 添加/删除状态 addState()/removeState()
  • 必须设置初始状态 setInitialState(QAbstractState *state)start()状态机
  • 如果遇到错误,状态机会进入错误状态,除非遇到未定义的错误,状态机才会停止。

———— ● ————  ● ————  ● ————  ● ————

练习1:掌握最基础的框架——三态循环

目标:总共有3种状态:s1,s2,s3;状态循环:s1->s2->s3->s1;实现按下next按钮,切换下一个状态;QLabel显示当前状态。

    //UIQPushButton *nextButton = new QPushButton("next",this);QLabel *label = new QLabel(this);//1.创建状态机QStateMachine *machine = new QStateMachine(this);//2.创建基础状态 指定父对象避免泄露也更清晰QState *s1 = new QState(machine);QState *s2 = new QState(machine);QState *s3 = new QState(machine);//3.给每个状态分配修改属性的工作s1->assignProperty(label,"text","当前处于s1状态");s2->assignProperty(label,"text","当前处于s2状态");s3->assignProperty(label,"text","当前处于s3状态");//4.按下next按钮是触发状态切换的信号s1->addTransition(nextButton,&QPushButton::clicked,s2);s2->addTransition(nextButton,&QPushButton::clicked,s3);s3->addTransition(nextButton,&QPushButton::clicked,s1);//5.把状态放进状态机machine->addState(s1);machine->addState(s2);machine->addState(s3);//6.设置初始状态machine->setInitialState(s1);//7.启动状态机machine->start();

 

http://www.sczhlp.com/news/11624/

相关文章:

  • debian编译gstreamer
  • 欧拉公式:为什么e^jθ =cosθ+jsinθ
  • fyne构建gui程序在windows上缺少opengl驱动报错处理
  • [题解]P10185 [YDOI R1] Necklace
  • 面经学习-WebSocket
  • 新手机膜 25_8_14
  • uniapp 微信小程序上传二进制流文件
  • pyyzDay10
  • Mozilla警告针对附加组件开发者账户的网络钓鱼活动
  • python虚拟环境和包管理工具miniconda详解
  • I2C协议 : 针对面试深挖的随笔
  • Nexa SDK 支持本地运行 Kokoro 等语音模型;AI 猎头智能体 Standout:给 AI 打电话找工作丨日报
  • NOIP2024 T3 题解
  • 【高层次、国际化、连续11届EI检索】第十二届行为与社会计算国际会议(BESC 2025)
  • 基于无人系统的时空感知与智能计算
  • 解码芯安全,天翼云红盾实验室筑牢“芯”防线!
  • c#使用依赖注入
  • 磁盘挂载和Kafka概念和使用场景理解
  • MCP神器!MCP-USE 一键部署连接任何MCP服务器
  • 活动报名:出海增长,从 0 到 1,从 1 到 100、1000 一次性完整分享!丨RTE Meetup
  • 2025最新本土开发者的代码家园:Gitee 平台深度解析
  • MyEMS:用开源智能破解能源管理难题,从车间到园区的全场景实践
  • GospersHack 算法
  • 漏洞挖掘--网络攻击相关网络
  • Doris专题精讲【左扬精讲】—— 学习 Doris:从诞生到应用场景的全方位探索
  • 一个简单题的题解
  • P11989 笔记
  • Rocketmq半消息
  • 前端 html页面中各个元素介绍 head、body
  • Python生成MP3语音文件