2011-12-15 33 views
7

Qt(C++)で状態マシンを実装しようとしています。 QStateMachineの現在の状態を確認するにはどうすればよいですか? ドキュメントにメソッドが見つかりませんでした。C++ Qt:QStateMachineの現在の状態を確認します。

THX

+0

私は同じ問題があります。 :: configurationが提供するQSetを反復すると、QAbstractStateが得られます。これは明確な使い方ではありません。実際の例は素晴らしいでしょう。 – ExpatEgghead

+0

@ExpatEgghead @stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-to-workを参照してください。 –

+0

@ExpatEgghead:あなたはQtバージョン4.7または4.8ですか? ? – menjaraz

答えて

13

あなたはQStateMachine::configuration()を試してみましたか?

は、上記のURLからhttp://www.qtcentre.org/threads/42085-How-to-get-the-current-state-of-QStateMachine

抜粋を参照してください。

// QStateMachine::configuration() gives you the current states. 

while(stateMachine->configuration().contains(s2)) 
{ 
    //do something 
} 
+0

ええ、私がそれを試してみたとき、私が加えた国はありませんでした。私は自分のQStateクラスを持っていません。ちょうど普通のQStatesです。 – ExpatEgghead

+0

私のアプリケーションの一部として、アプリケーションの現在の状態を別のマシンに送信する必要があります。このためにセットを狩るのは賢明ではないようです。おそらく私の間違いは、私のすべての州の派生クラスを作成していないということでした。 – ExpatEgghead

+0

@ExpatEgghead:問題を説明する完全なコードを最小限に抑えることができれば、より多くの関心を集めることができると思います。 – menjaraz

5

あなたはQStateMachine自体にプロパティを割り当てることができます。

// QState  m_State1; 
// QState  m_State2; 
// QStateMachine m_Machine; 

m_State1.assignProperty(m_Label, "visible", false); 
m_State1.assignProperty(&m_Machine, "state", 1); 

m_State2.assignProperty(m_Label,  "visible", true); 
m_State2.assignProperty(&m_Machine, "state", 2); 

次に、現在の状態を動的プロパティから読み取ることができます。

qDebug() << m_Machine.property("state"); 
0

Qt 5.7 Documentationから

QSET QStateMachine ::構成()constは

この状態マシンは、現在であること(平行状態と最終状態を含む)状態の最大一貫したセットを返し。状態sが構成内にある場合、sの親が常にcにある場合もあります。ただし、マシン自体は構成の明示的なメンバーではありません。

使用例:

bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const 
{ 
    if (aMachine_.configuration().contains(aState)) return true; 
    return false 
} 
0

私は後半に来て実現し、うまくいけば、この答えは、この全体につまずく誰に役立ちます。

あなたは既にconfiguration()を使用しようとしましたが、そこにはあなたの状態はありませんでした。これはstart()が非同期であるためです。

したがって、start()を呼び出した直後にconfiguration()を呼び出したとすると、あなたの状態はまだ存在していません。 QStateMachineクラスのstarted()シグナルを使用して、必要な機能を取得できます。それをチェックアウト:

stateMachine->setInitialState(someState); 
stateMachine->start(); 
connect(stateMachine, SIGNAL(started()), this, SLOT(ReceiveStateMachineStarted())); 

次に、あなたのReceiveStateMachineStarted()スロットのために、あなたはこのような何か行うことができます:

void MyClass::ReceiveStateMachineStarted() { 
    QSet<QAbstractState*> stateSet = stateMachine->configuration(); 
    qDebug() << stateSet; 
} 

をあなたの状態マシンが初期状態に入ると、それは(スタートを放出します)信号。あなたが書いたスロットにそれが聞こえて、設定が印刷されます。詳細については、次のQtドキュメントを参照してください。

http://doc.qt.io/qt-5/qstatemachine.html#started

関連する問題