2017-08-17 23 views
0

たとえば、QStateMachineを実行する1組のロボットがあります。これらのロボットのすべてのステート・マシンは、同じ基本構造を持っている: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(); 
} 

今、私は多分、もう少し具体的なあるロボットを持っていると思います。彼が破壊の過程でより詳細で、2つのサブステージを特徴とするとしましょう。 dismantel -> sprayWithAcid -> blowUp -> desintegrate、彼はそれぞれnext-signalと一緒に移動するか、または彼はのback-signalに進みます。

前述のように私の計画では、状態をdestroyにサブ状態として追加するだけでしたが、信号nextは終了するまでサブマシンを続けるだけでなく、親状態を残します。

どうすればこの問題を回避できますか?か、それと似たような良い方法がありますか?

答えて

0

私はそれを今得ました。

トランジションは、明示的にトランジションをクラスのメンバーとして持つことです。私がsourceを混合し、target->addTransition(sender, signal, target_state)の構文とあまりにも似ているように私が最初に間違ったQSignalTransition(sender, signal, source_state)コンストラクタの間違ったパラメータを持っていた得たもの

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); 

を:あなたはこのようにそれらを設定することができます。

このように作成した後、このオブジェクトをサブクラス化するときに、移行の一部を再ルーティングまたは無効にするのは簡単です。

関連する問題