0%

QState

摘要

  • QState 类 相关学习笔记

Qt QState类 详解

QState 是 Qt 状态机框架(QStateMachine)中的一个核心类,用于表示状态机中的一个状态。它可以用来定义状态的行为、属性以及状态之间的转换规则。QState 通常与 QStateMachineQFinalStateQAbstractTransition 等类一起使用,用于构建和管理复杂的状态机逻辑。

以下是 QState 类的详细解析,包括其功能、常用方法、信号与槽以及使用示例。


1. QState 的功能

QState 的主要功能包括:

  • 定义状态机中的一个状态。
  • 管理状态的属性(如对象属性的赋值)。
  • 定义状态的进入和退出行为。
  • 管理状态之间的转换(通过 addTransition 方法)。
  • 支持嵌套状态(子状态)和并行状态。

2. QState 的常用方法

2.1 状态管理

  • addTransition(sourceState, signal, targetState):
    添加一个从当前状态到目标状态的转换。当 signal 触发时,状态机从 sourceState 转换到 targetState

    1
    2
    3
    QState *state1 = new QState();
    QState *state2 = new QState();
    state1->addTransition(button, &QPushButton::clicked, state2);
  • removeTransition(transition):
    移除指定的状态转换。

  • assignProperty(object, propertyName, value):
    在进入该状态时,将 objectpropertyName 属性设置为 value

    1
    state1->assignProperty(button, "text", "State 1");

2.2 状态生命周期

  • onEntry(event):
    重写此函数以定义进入状态时执行的操作。

    1
    2
    3
    4
    QState *state = new QState();
    connect(state, &QState::entered, []() {
    qDebug() << "Entered state!";
    });
  • onExit(event):
    重写此函数以定义退出状态时执行的操作。

    1
    2
    3
    connect(state, &QState::exited, []() {
    qDebug() << "Exited state!";
    });

2.3 状态属性

  • setInitialState(state):
    设置当前状态的初始子状态(用于嵌套状态机)。

    1
    2
    3
    QState *parentState = new QState();
    QState *childState = new QState(parentState);
    parentState->setInitialState(childState);
  • initialState():
    返回当前状态的初始子状态。

  • childMode()setChildMode(mode):
    获取或设置子状态模式(QState::ExclusiveStatesQState::ParallelStates)。


2.4 状态机管理

  • stateMachine():
    返回该状态所属的状态机(QStateMachine 对象)。

  • parentState():
    返回该状态的父状态(如果是嵌套状态)。


2.5 错误处理

  • errorState()setErrorState(state):
    获取或设置错误状态。当状态机进入错误状态时,会触发 QStateMachine::finished 信号。

3. 信号与槽

  • entered() 信号:
    当进入该状态时触发。

    1
    2
    3
    connect(state, &QState::entered, []() {
    qDebug() << "State entered!";
    });
  • exited() 信号:
    当退出该状态时触发。

    1
    2
    3
    connect(state, &QState::exited, []() {
    qDebug() << "State exited!";
    });

4. 状态类型

QState 支持两种子状态模式:

  • QState::ExclusiveStates:
    子状态是互斥的,同一时间只能有一个子状态处于活动状态(默认模式)。
  • QState::ParallelStates:
    子状态是并行的,多个子状态可以同时处于活动状态。

5. 使用示例

5.1 简单状态机示例

以下是一个简单的状态机示例,包含两个状态和一个最终状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <QCoreApplication>
#include <QStateMachine>
#include <QState>
#include <QFinalState>
#include <QDebug>

int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);

QStateMachine machine;

QState *state1 = new QState();
QState *state2 = new QState();
QFinalState *finalState = new QFinalState();

state1->assignProperty(&app, "property", "State 1");
state2->assignProperty(&app, "property", "State 2");

state1->addTransition(&app, &QCoreApplication::aboutToQuit, state2);
state2->addTransition(&app, &QCoreApplication::aboutToQuit, finalState);

machine.addState(state1);
machine.addState(state2);
machine.addState(finalState);

machine.setInitialState(state1);
machine.start();

QObject::connect(&machine, &QStateMachine::finished, &app, &QCoreApplication::quit);

return app.exec();
}

5.2 嵌套状态示例

以下是一个嵌套状态的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QCoreApplication>
#include <QStateMachine>
#include <QState>
#include <QFinalState>
#include <QDebug>

int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);

QStateMachine machine;

QState *parentState = new QState();
QState *childState1 = new QState(parentState);
QState *childState2 = new QState(parentState);
QFinalState *finalState = new QFinalState();

parentState->setInitialState(childState1);

childState1->addTransition(&app, &QCoreApplication::aboutToQuit, childState2);
childState2->addTransition(&app, &QCoreApplication::aboutToQuit, finalState);

machine.addState(parentState);
machine.addState(finalState);

machine.setInitialState(parentState);
machine.start();

QObject::connect(&machine, &QStateMachine::finished, &app, &QCoreApplication::quit);

return app.exec();
}

6. 总结

QState 是 Qt 状态机框架的核心类之一,用于定义状态、管理状态转换和处理状态生命周期。通过结合 QStateMachine 和其他相关类,可以轻松构建复杂的状态机逻辑。QState 提供了丰富的功能,包括状态属性管理、嵌套状态、并行状态以及错误处理等,非常适合用于实现复杂的应用程序逻辑。

感谢老板支持!敬礼(^^ゞ