我们说我有一群运行QStateMachine
的机器人。这些机器人的所有状态机都具有相同的基本结构:
from
上的转化(to
- > signal
:
// 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
信号,或者在return
信号后继续back
。
如前所述,我的计划是将它们作为子状态添加到状态destroy
,但是信号next
不仅会继续子状态直到完成,而且还会离开父状态。 / p>
我该如何避免这种情况?还是有另一种不太好的做法吗?
答案 0 :(得分:0)
我现在知道了。
诀窍是明确地创建过渡,将它们作为类的成员。你可以像这样设置它们:
QSignalTransition(sender, signal, source_state)
我首先遇到的错误是->addTransition(sender, signal, target_state)
构造函数的参数错误,因为它与source
的语法太相似所以我混淆了target
和{{1}}
在像这样创建它们之后,在对该对象进行子类化时,应该很容易重新路由或禁用其中一些转换。