Qt Qml状态机框架

Qt5.4引入了QML状态机框架,与C++状态机框架类似,可以在应用程序中创建并执行状态图。为此,QtQml.StateMachine模块提供了一些相关的QML类型,用于创建事件驱动的状态机,这些QML类型列举如下:

StateMachine——
状态机管家,执行算法基于SCXML(State
Chart XML),在状态机启动之前要设置好初始状态,即initialState属性。

State——状态机中的通用类型,注意与QtQuick模块中的State类型不同,导入模块时先导入QtQuick模块,后导入QtQml.StateMachine模块。

FinalState——
顾名思义,状态机工作结束时使用这个状态,会触发这个状态机的finished()信号。

HistoryState——
是个伪状态,记录了最后一次退出父状态时的子状态,一开始可指定一个默认状态。

SignalTransition——
根据特定的信号切换状态。

TimeoutTransition——
根据定时器切换状态。

下面是一个综合的例子:

// Qt5.4
// 先导入QtQuick模块,后导入QtQml.StateMachine模块
import QtQuick 2.4
import QtQuick.Controls 1.2
import QtQml.StateMachine 1.0

Item {
    width: 400
    height: 200

    Row {
        anchors.centerIn: parent
        spacing: 10

        Button {
            id: startButton
            text: "start"
            onClicked: {
                // 启动状态机
                if (!stateMachine.running) {
                    stateMachine.running = true
                }
            }
        }
        Button {
            id: button
            // 状态机标识
            text: s11.active ? "s11" : s12.active ? "s12" : s13.active ? "s13" : "state"
        }
        Button {
            id: historyButton
            // 历史状态记录
            text: stateMachine.running ? s1.active ? "interrupt" : "resume" : "history"
        }
        Button {
            id: quitButton
            text: "quit"
        }
    }

    StateMachine {
        id: stateMachine
        initialState: s1 // 初始状态
        // running: true // running属性由button(startButton)设置

        State {
            id: s1
            initialState: s11 // 初始状态

            SignalTransition {
                targetState: s3 // 根据signal切换state
                signal: historyButton.clicked
            }
            SignalTransition {
                targetState: s2 // 根据signal切换state
                signal: quitButton.clicked
            }
            onEntered: console.log("s1 entered")
            onExited: console.log("s1 exited")

            State {
               id: s11
               SignalTransition {
                   targetState: s12 // 根据signal切换state
                   signal: button.clicked
               }
               onEntered: console.log("s11 entered")
               onExited: console.log("s11 exited")
            }
            State {
               id: s12
               SignalTransition { // 根据signal切换state
                   targetState: s13
                   signal: button.clicked
               }
               SignalTransition { // override父state的signal(quitButton.clicked)
                   signal: quitButton.clicked
                   onTriggered: console.log("override - quitButton clicked")
               }
               onEntered: console.log("s12 entered")
               onExited: console.log("s12 exited")
            }
            State {
                id: s13
                SignalTransition { // 根据signal切换state
                    targetState: s11
                    signal: button.clicked
                }
                TimeoutTransition { // 根据定时器切换state
                    targetState: s2
                    timeout: 2000
                }
                onEntered: console.log("s13 entered")
                onExited: console.log("s13 exited")
            }
            HistoryState { // 历史状态
                id: history
            }
        }

        State {
            id: s3
            SignalTransition { // 根据signal切换state
                targetState: history
                signal: historyButton.clicked
            }
            onEntered: console.log("s3 entered")
            onExited: console.log("s3 exited")
        }

        FinalState {
            id: s2
        }
        onFinished: console.log("state finished")
    }
}

另外,State的childMode属性默认是单状态模式,一开始要设置一个初始状态,我们还可以设置childMode为并行模式,当进入父状态时,就会同时进入所有的子状态。

详细介绍可参考如下Qt官网文档:

http://doc.qt.io/qt-5/qmlstatemachine.html

时间: 2024-07-30 10:19:50

Qt Qml状态机框架的相关文章

Qt 状态机框架学习(没学会)

Qt状态机框架是基于状态图XML(SCXML) 实现的.从Qt4.6开始,它已经是QtCore模块的一部分.尽管它本身是蛮复杂的一套东西,但经过和Qt的事件系统(event system).信号槽(signals and slots)及属性系统(property system)深度整合,它使用门槛并不高. 一些概念 Qt的手册中The State Machine Framework一文对Qt状态机框架及使用进行了介绍,可是还是发现看看基本的概念(详见  SCXML   的  第三部分 )更有帮助

Qt之动画框架

简述 Qt动画框架旨在为创建动画和平滑的GUI提供了一种简单的方法.通过Qt动画属性,该框架为部件和其它QObject对象的动画操作提供了非常大的自由性,框架也可以被用于图形视图框架中,动画框架中许多可用的概念也可以用于Qt Quick,它提供了一种声明式的方式定义动画.大部分关于动画框架学到的知识都可以应用于Qt Quick. 本篇,我们阐述了Qt动画框架的基本结构.同时,会展示最常见的技术示例,用于动画操作QObject和图形项. 简述 动画框架结构 动画框架类 Qt动画属性 动画和图形视图

详解Qt的动画框架(一)

Qt的动画框架是在4.6版本引入的.通过Qt动画属性,Qt动画框架为部件和其他QObject对象的动画操作提供了非常大的自由性.Qt动画框架也能用于图形视图框架中.以下是Qt中的有关动画框架类的类视图: Qt的动画框架的Base是由QAbstactionAnimation以及它的两个子类QVariantAnimation和QAnimationGroup组成.QAbstractAnimation类是所有动画类的祖先.它包含了一些在框架中被普遍使用的基本功能:尤其是启动.停止和暂停动画功能.它也接收

Qt QML referenceexamples attached Demo hacking

/********************************************************************************************* * Qt QML referenceexamples attached Demo hacking * 说明: * 1. 本源代码来自Qt自带的Example,而本文也仅仅是代码解读,需要有点基础: * 2. 由于是Qt自带Demo,分为几个文件,文件存在联系,而本人把所有代码放在这个文件里,会照成阅读困难:

Qt官方教程翻译——Qt QML

Pull 解析器简介 Pull 解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件.跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理.当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值. Pull解析器的源码及文档下载网址:http://www.xmlpul

qt qml中PropertyAnimation的几种使用方法

qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移动到一个特定的位置 2,动画仅仅有在某一个特定的外部行为触发时候才会被触发,比如,鼠标单击某一个控件时候,产生动画.使目标移动到指定的位置 3,仅仅有在某一个特定的信号后才触发 4,做为一个独立的动画,尽管没有绑定rectangle的运动,可是能够在脚本中载入,開始和停止 5.仅仅有在状态改变时候才

Qt qml listview 下拉刷新上拉分页控件

Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 1 下拉刷新和上拉分页逻辑 2 /下拉刷新 3 /上拉更多 4 /滚动栏 5 /工具栏半拉显隐 6 Author: surfsky.cnblogs.com 7 Lisence: MIT 请保留此文档声明 8 History: 9 init. surfsky.cnblogs.com, 2015-01 10 a

QT QML Keys 处理注意事项

今天在学习 QT QML 最基本的东东,在下面的代码中响应按键处理无效.代码如下: 1 import QtQuick 2.2 2 import QtQuick.Window 2.1 3 import QtQuick.Controls 1.2 4 5 Window { 6 visible: true 7 width: 360 8 height: 360 9 10 MouseArea { 11 anchors.fill: parent 12 onClicked: { 13 Qt.quit(); 14

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

Qt qml中listview 列表视图控件(下拉刷新.上拉分页.滚动轴) 来源 https://www.cnblogs.com/surfsky/p/4352898.html 设置ListView涉及到将contentsY,即视图的可见部分的顶部,设置y为委托的值.另一个更改是interactive将视图设置为false.这样可以防止视图移动.用户不能再滚动列表或更改当前Item. contentY为列表上拉后列表左上角点距显示框左上解点的高度listView1.height为可显示部分的高度,