基本概念
- 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();
使用信号和槽进行状态转换
假设您有函数来处理具体的操作,比如开始做样和处理异常,您可以在这些函数中发射上面定义的信号来触发状态转换。
小结
- 初始化:创建状态机和状态,然后定义状态间的转换。
- 动作:为每个状态的进入和退出定义动作。
- 转换:基于事件(信号)触发状态转换。