मैं संकेतों में 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;
}
रिकॉर्ड के लिए, यह समस्या हल करने का कारण यह है कि मेटाबोजेक्ट सिस्टम (सामान्यीकृत) स्ट्रिंग तुलना के आधार पर सिग्नल/स्लॉट संगतता का निर्णय ले रहा है। यह "संदर्भ" नहीं है कि 'राज्यमाचिन :: राज्य' और 'राज्य' इस संदर्भ में एक ही प्रकार का संदर्भ लें। – rohanpm
मुझे क्यूटी 4.8 का उपयोग करके qRegisterMetaType की आवश्यकता नहीं है, बस हर जगह पूरी तरह से योग्य नाम हैं। – kikeenrique
लाइन 'Q_DECLARE_METATYPE (StateMachine :: state)' से अर्धविराम को हटाकर 'qRegisterMetaType()' को स्पष्ट रूप से कॉल किए बिना एक समान उदाहरण मिला है। – user666412