假设我有一群运行QStateMachine的机器人。这些机器人的所有状态机都有相同的基本结构:
from -> to on 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-signal,或者继续back-signal上的return。
如前所述,我的计划是将它们作为子状态添加到状态destroy中,但是由于信号next不仅将继续子状态直到完成,而且还会离开父状态。
我怎样才能避免这种情况?还是有另一种很好的方法来做类似的事情?
发布于 2017-08-17 15:36:20
我现在明白了。
诀窍是显式地创建转换,让它们成为类的成员。你可以这样设置它们:
m_sleepSearch = new QSignalTransition(this, &Base::next, m_sleep);
m_searchDestroy = new QSignalTransition(this, &Base::next, m_search);
m_searchReturn = new QSignalTransition(this, &Base::back, m_search);
m_destroySearch = new QSignalTransition(this, &Base::next, m_destroy);
m_destroyReturn = new QSignalTransition(this, &Base::back, m_destroy);
m_returnSearch = new QSignalTransition(this, &Base::next, m_return);
m_returnSleep = new QSignalTransition(this, &Base::back, m_return);
m_sleepSearch->setTargetState(m_search);
m_searchDestroy->setTargetState(m_destroy);
m_searchReturn->setTargetState(m_return);
m_destroySearch->setTargetState(m_search);
m_destroyReturn->setTargetState(m_return);
m_returnSearch->setTargetState(m_search);
m_returnSleep->setTargetState(m_sleep);我首先犯的错误是为QSignalTransition(sender, signal, source_state)构造函数设置了错误的参数,因为它太类似于->addTransition(sender, signal, target_state)的语法,所以我混淆了source和target。
在像这样创建它们之后,在子类对象时,应该很容易重新路由或禁用其中的一些转换。
https://stackoverflow.com/questions/45738617
复制相似问题