2011-12-15 14 views
7

जांचें मैं क्यूटी (सी ++) में एक राज्य-मशीन को लागू करने की कोशिश कर रहा हूं। मैं QStateMachine की वर्तमान स्थिति कैसे देख सकता हूं? मुझे प्रलेखन में कोई विधि नहीं मिली।सी ++ क्यूटी: वर्तमान स्थिति QStateMachine

THX

+0

मैं एक ही समस्या है: इस बारे में अधिक के लिए, निम्न क्यूटी दस्तावेज़ देखें। QSet को इटरेट करना कि :: कॉन्फ़िगरेशन मुझे QAbstractState प्रदान करता है जो स्पष्ट उपयोग नहीं है। एक कामकाजी उदाहरण बहुत अच्छा होगा। – ExpatEgghead

+0

@ExpatEgghead कृपया http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-to-work देखें, यह आपकी मदद कर सकता है –

+0

@ExpatEgghead: आप क्यूटी संस्करण, 4.7 या 4.8 क्या हैं ? – menjaraz

उत्तर

13

आप 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 
} 
+0

वैसे हाँ, लेकिन जब मैंने कोशिश की तो मैंने जो भी राज्य जोड़े थे, वहां कोई भी नहीं था। मेरे पास अपने स्वयं के क्यूस्टेट कक्षाएं नहीं हैं, केवल नियमित क्यूस्टेट्स हैं। – 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 :: विन्यास() स्थिरांक

से राज्यों के अधिक से अधिक संगत सेट (समानांतर और अंतिम राज्यों सहित) देता है कि इस राज्य मशीन में है। यदि कोई राज्य कॉन्फ़िगरेशन में है, तो यह हमेशा ऐसा होता है कि एस के माता-पिता भी सी में हैं। नोट, हालांकि, यह मशीन स्वयं कॉन्फ़िगरेशन का स्पष्ट सदस्य नहीं है।

उदाहरण उपयोग:

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

मुझे पता है मैं देर में आ रहा हूँ, लेकिन उम्मीद है कि इस जवाब ने इस भर में ठोकर किसी और को मदद मिलती है।

आपने ऊपर बताया है कि आपने पहले ही कॉन्फ़िगरेशन() का उपयोग करने का प्रयास किया है, लेकिन आपके कोई भी राज्य वहां नहीं था - ऐसा इसलिए है क्योंकि प्रारंभ() असीमित है।

तो, मानते हुए कि आपने प्रारंभ (कॉल) को कॉल करने के तुरंत बाद कॉन्फ़िगरेशन() कहा है, यह समझ में आता है कि आपके राज्य अभी तक नहीं थे। QStateMachine क्लास के प्रारंभ() सिग्नल का उपयोग कर आप जो कार्यक्षमता चाहते हैं उसे प्राप्त कर सकते हैं। इसे देखें:

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

फिर, अपने ReceiveStateMachineStarted() स्लॉट के लिए, आप कुछ इस तरह कर सकता है:

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

जब अपने राज्य मशीन अपनी प्रारंभिक अवस्था में प्रवेश, यह शुरू उत्सर्जित करेगा() संकेत। आपके द्वारा लिखे गए स्लॉट को यह सुना जाएगा और कॉन्फ़िगरेशन प्रिंट करेगा।

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

संबंधित मुद्दे