2012-09-11 15 views
16

मैं संकेतों में enum प्रकार का उपयोग कर के साथ कुछ परेशानी है में enums का उपयोग कैसे करें। मूल रूप से मेरे पास दो वर्ग हैं, एक राज्य मशीन और एक थ्रेड राज्य मशीन को संभालने वाला है। जब राज्य बदल जाता है तो मैं नए राज्य के साथ एक संकेत भेजना चाहता हूं। मैं भी एक enum का उपयोग कर राज्य का प्रतिनिधित्व करना चाहते हैं। मेरे पूर्ण उड़ाए गए कोड में राज्य मशीन को एक अलग साझा लाइब्रेरी में लागू किया गया है, लेकिन नीचे दिया गया कोड सटीक एक ही त्रुटि देता है।क्यूटी संकेतों और स्लॉट

जब मैं कोड मैं निम्नलिखित व्यवहार प्राप्त चलाएँ:

[email protected]:sigenum $ ./sigenum 
Object::connect: No such slot MyThread::onNewState(state) 
Test signal 
Test signal 
... 

मैं अपने नमूना कोड में चार फ़ाइलें: statemachine.h, statemachine.cpp, main.h और main.cpp। मुख्य कार्य बस, धागा शुरू होता है धागा तो StateMachine का एक उदाहरण बनाता है और StateMachine से संकेत संसाधित करता है। मैं क्यूटी के लिए बहुत नया हूँ, इसलिए मैं थोड़ा हैरान जब मुझे एहसास हुआ कि आप Q_ENUMS साथ enum लगा और प्रकार प्रणाली के साथ यह रजिस्टर करने के लिए है कि था। तो यह पूरी तरह से संभव है कि मैंने कुछ रूकी गलती की है

नीचे दिया गया कोड थोड़ा लंबा है, लेकिन मैं चाहता था कि यह मेरे वास्तविक कोड के समान हो।

// statemachine.h 
#ifndef _STATEMACHINE_H 
#define _STATEMACHINE_H 

#include <QtCore> 

class StateMachine : public QObject 
{ 
    Q_OBJECT 
    Q_ENUMS(state) 

public: 
    enum state {S0, S1, S2}; 

    void setState(state newState); 

signals: 
    void stateChanged(state newState); 
    void testSignal(void); 
}; 

Q_DECLARE_METATYPE(StateMachine::state); 

#endif 

और यह के रूप में कार्यान्वित किया जाता है:

// statemachine.cpp 
#include <QtCore> 

#include "statemachine.h" 

void StateMachine::setState(state newState) 
{ 
    emit stateChanged(newState); 
    emit testSignal(); 
} 

धागे के रूप

// main.h 
#ifndef _MAIN_H 
#define _MAIN_H 

#include <QtCore> 

#include "statemachine.h" 

class MyThread : public QThread 
{ 
    Q_OBJECT 

private: 
    void run(void); 

private slots: 
    void onNewState(StateMachine::state); 
    void onTestSignal(void); 

private: 
    StateMachine *myStateMachine; 
}; 

#endif 

परिभाषित किया गया है और यह लागू किया गया है इस प्रकार है:

statemachine.h की तरह लग रहा

// main.cpp 
#include <QtCore> 
#include <QApplication> 

#include "statemachine.h" 
#include "main.h" 

void MyThread::run() 
{ 
    myStateMachine = new StateMachine(); 

    qRegisterMetaType<StateMachine::state>("state"); 

    // This does not work 
    connect(myStateMachine, SIGNAL(stateChanged(state)), 
      this, SLOT(onNewState(state))); 

    // But this does... 
    connect(myStateMachine, SIGNAL(testSignal()), 
      this, SLOT(onTestSignal())); 

    forever { 
     // ... 
     myStateMachine->setState(StateMachine::S0); 
    } 
} 

void MyThread::onTestSignal() 
{ 
    qDebug() << "Test signal"; 
} 

void MyThread::onNewState(StateMachine::state newState) 
{ 
    qDebug() << "New state is:" << newState; 
} 

उत्तर

15

काम करेंगे पूरी तरह से योग्य नाम हर जगह का उपयोग करके मैं

काम करने के लिए अगर मैं बदल यह मिल गया stateChanged() से

की घोषणा
signals: 
    void stateChanged(StateMachine::state newState); 

और

qRegisterMetaType<StateMachine::state>("StateMachine::state"); 

और भी साथ प्रकार connect बयान में इस नाम का उपयोग करता

connect(myStateMachine, SIGNAL(stateChanged(StateMachine::state)), 
     this, SLOT(onNewState(StateMachine::state))); 

drescherjm से इनपुट के बिना यह समाधान कर लिया है नहीं चाहेंगे, धन्यवाद :-) पंजीकृत करता है

+4

रिकॉर्ड के लिए, यह समस्या हल करने का कारण यह है कि मेटाबोजेक्ट सिस्टम (सामान्यीकृत) स्ट्रिंग तुलना के आधार पर सिग्नल/स्लॉट संगतता का निर्णय ले रहा है। यह "संदर्भ" नहीं है कि 'राज्यमाचिन :: राज्य' और 'राज्य' इस संदर्भ में एक ही प्रकार का संदर्भ लें। – rohanpm

+0

मुझे क्यूटी 4.8 का उपयोग करके qRegisterMetaType की आवश्यकता नहीं है, बस हर जगह पूरी तरह से योग्य नाम हैं। – kikeenrique

+0

लाइन 'Q_DECLARE_METATYPE (StateMachine :: state)' से अर्धविराम को हटाकर 'qRegisterMetaType()' को स्पष्ट रूप से कॉल किए बिना एक समान उदाहरण मिला है। – user666412

4

मैं निम्नलिखित का मानना ​​है कि राज्य अपने MyThread कक्षा में परिभाषित नहीं है।

उपयोग निम्नलिखित

 
connect(myStateMachine, SIGNAL(stateChanged(StateMachine::state)), 
      this, SLOT(onNewState(StateMachine::state))); 

संपादित करें:

हो सकता है कि इस

 
connect(myStateMachine, SIGNAL(stateChanged(state)), 
      this, SLOT(onNewState(StateMachine::state))); 
+0

तब मुझे कोई संकेत नहीं मिला राज्यमाचिन :: स्टेट चेंज (स्टेटमैचिन :: राज्य) 'इसके बजाय – Kotte

+1

क्या आपने कोशिश की है आप MyThread इंटरफ़ेस में एक टाइपेडफ का उपयोग कर।मेरा मतलब है typedef StateMachine :: राज्य स्थिति; – drescherjm

+0

हम्म, लेकिन यह मुझे समाधान के लिए नेतृत्व किया, धन्यवाद :) – Kotte

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