簡體   English   中英

C ++ Qt:檢查QStateMachine的當前狀態

[英]C++ Qt: Check the current State of QStateMachine

我正在嘗試在Qt(C ++)中實現狀態機。 如何檢查QStateMachine的當前狀態? 我在文檔中找不到方法。

謝謝

你試過QStateMachine::configuration()嗎?

參考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
}

您可以將屬性分配給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");

Qt 5.7文檔

QSet QStateMachine :: configuration()const

返回此狀態機當前所處的最大一致狀態集(包括並行狀態和最終狀態)。如果狀態s在配置中,則s的父節點也始終在c中。 但請注意,機器本身不是配置的顯式成員。

用法示例:

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

我意識到我遲到了,但希望這個答案可以幫助那些偶然發現這一點的人。

您在上面提到過,您已經嘗試過使用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;
}

當狀態機進入初始狀態時,它將發出start()信號。 您編寫的插槽將聽到並打印配置。 有關此問題的更多信息,請參閱以下Qt文檔:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM