【发布时间】:2017-08-17 23:36:20
【问题描述】:
假设我有一组运行QStateMachine 的机器人。这些机器人的所有状态机都具有相同的基本结构:
- 状态:
- 睡觉
- 搜索
- 销毁
- 返回
- 转换 (
from->toonsignal:- 睡眠 -> 搜索“下一个”
- 搜索 -> 销毁“下一个”
- 销毁 -> 搜索“下一个”
- 销毁 -> “返回”返回
- 搜索 -> “返回”返回
- 返回 -> 搜索“下一个”
- 返回 -> 睡在“后面”
// base.h
#include <QObject>
#include <QState>
#include <QStateMachine>
class Base : public QObject
{
Q_OBJECT
public:
Base(QObject* parent = 0);
~Base();
signals:
void next();
void back();
private:
QStateMachine m_machine;
QState* m_sleep;
QState* m_search;
QState* m_destroy;
QState* m_return;
};
// base.cpp
Base::Base(QObject* parent) : QObject(parent)
{
m_sleep = new QState(&m_machine);
m_search = new QState(&m_machine);
m_destroy = new QState(&m_machine);
m_return = new QState(&m_machine);
m_machine.setInitialState(m_sleep);
m_sleep->addTransition(this, &Base::next, m_search);
m_search->addTransition(this, &Base::next, m_destroy);
m_search->addTransition(this, &Base::back, m_return);
m_destroy->addTransition(this, &Base::next, m_search);
m_destroy->addTransition(this, &Base::back, m_return);
m_return->addTransition(this, &Base::next, m_search);
m_return->addTransition(this, &Base::back, m_sleep);
m_machine.start();
}
现在我想要一个更具体的机器人。假设他在破坏过程中更详细,具有几个子状态,例如dismantel -> sprayWithAcid -> blowUp -> desintegrate,他在每个next-signal 上继续前进,或者他在back-signal 上继续return。
如前所述,我的计划是将它们作为子状态添加到状态 destroy,但信号 next 不仅会继续子状态机直到完成,还会离开父状态。
我怎样才能避免这种情况?或者还有其他类似的好方法吗?
【问题讨论】:
标签: c++ qt qt5 qstatemachine