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

Qt 范例阅读: QStateMachine状态机框架 和 SCXML 引擎简单记录(方便后续有需求能想到这两个东西)

一、QStateMachine 简单应用: 实现按钮的文本切换

    QStateMachine machine; //定义状态机(头文件定义)

    QState *off = new QState(); //添加off 状态
    off->assignProperty(ui->pushButton_2, "text", "Off"); //绑定该状态到按钮的 text 属性上
    off->setObjectName("off");
    QState *on = new QState(); //添加off 状态
    on->setObjectName("on");
    on->assignProperty(ui->pushButton_2, "text", "On"); //绑定该状态到按钮的 text 属性上
    off->addTransition(ui->pushButton_2, &QAbstractButton::clicked, on); //添加转换条件
    on->addTransition(ui->pushButton_2, &QAbstractButton::clicked, off);

    //绑定状态 进入、退出 信号
    QObject::connect(on, &QState::entered, this, [=](){
        qDebug() << "QState on enter";
    });
    QObject::connect(off, &QState::exited, this, [=](){
        qDebug() << "QState off exited";
    });

    //添加状态到状态机
    machine.addState(off);
    machine.addState(on);
    machine.setInitialState(off); //设置初始状态
    machine.start(); //运行状态机

二、SCXML: 一种 状态机描述 XML 格式文件 ;qt 可以之间通过 图形界面拖拽的方式生成,比较方便。具体案例 qt 搜索 scxml 即可。

        案例:交通灯:trafficlight-widgets-dynamic

        scxml 文件含义:定义了两个大的状态 working 、broken

        working 状态下子状态有:red 、green、yellow(子状态:redGoingGreen、greenGoingRed)

        broken 状态下子状态有: blinking 、 unblinking

        整个文件已经定义好了各个状态之间的切换条件、所以启动状态机后状态机会自动运转

属性界面:red : 标识状态 ;onentry 标识 进入red 状态要执行的行为 是 send startGoingGreen 事件。下面delay 3s 应该是延时3s 才发送事件

        main.cpp

    //读取scxml 文件内容,创建状态机
    QScxmlStateMachine *machine = QScxmlStateMachine::fromFile(
                QStringLiteral(":statemachine.scxml"));
    if (!machine->parseErrors().isEmpty()) {
        QTextStream errs(stderr, QIODevice::WriteOnly);
        const auto errors = machine->parseErrors();
        for (const QScxmlError &error : errors) {
            errs << error.toString();
        }

        return -1;
    }

    TrafficLight widget(machine); //和状态机绑定的界面
    widget.show();
    machine->setParent(&widget);
    machine->start(); //启动状态机

        TrafficLight.cpp

    //将状态机的状态 和 界面相关的处理函数链接
    machine->connectToState(QStringLiteral("red"),
                            widget->redLight(), &LightWidget::switchLight);
    machine->connectToState(QStringLiteral("redGoingGreen"),
                            widget->redLight(), &LightWidget::switchLight);
    machine->connectToState(QStringLiteral("yellow"),
                            widget->yellowLight(), &LightWidget::switchLight);
    machine->connectToState(QStringLiteral("blinking"),
                            widget->yellowLight(), &LightWidget::switchLight);
    machine->connectToState(QStringLiteral("green"),
                            widget->greenLight(), &LightWidget::switchLight);

    //状态机的切换逻辑是在scxml 中定义好了的


http://www.kler.cn/a/228289.html

相关文章:

  • 【ARTS】【LeetCode-704】二分查找算法
  • 【网络协议】【http】【https】TLS解决了HTTP存在的问题-加密通信+摘要,数字签名+CA证书
  • 论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24
  • DDD实战课 笔记
  • k8s的CICD实施项目
  • rocketmq基本架构
  • k8s学习-数据管理
  • Jmeter 01 -概述线程组
  • windows下docker的使用
  • STM32—系统定时器
  • 炸裂!可视化大模型内部架构的实用工具!
  • C#,雅各布斯塔尔—卢卡斯(Jacobsthal Lucas Number)的算法与源代码
  • Pytest 与allure测试报告集成
  • leetcode 3.无重复字符的最长字串(滑动窗口) (C++)DAY2
  • 目标检测及相关算法介绍
  • 逆向基础-破解密码
  • spring boot打完jar包后使用命令行启动,提示xxx.jar 中没有主清单属性
  • Unity3D实现坦克大战
  • vue基本语法总结大全
  • 【算法与数据结构】583、72、LeetCode两个字符串的删除操作+编辑距离
  • 【图论】基环树
  • NuxtJs安装Sass后出现ERROR:Cannot find module ‘webpack/lib/RuleSet‘
  • 【从浅到深的算法技巧】排序应用,查找
  • 生物素 PEG4 甲基四嗪,Biotin-PEG4-methyltetrazine,用于标记、追踪和分离特定的分子或细胞
  • 【TCP/IP】用户访问一个购物网站时TCP/IP五层参考模型中每一层的功能
  • Python学习笔记(水桶谜题代码学习)——应用*符号解包列表所有元素传递给函数用法