2013-01-08 12 views
7

में मेटा प्रकार पंजीकृत करें मेरे पास एक कक्षा है और मैं इसे क्यूविरिएंट में उपयोग करना चाहता हूं, इसलिए मुझे मेटा प्रकार घोषित करने और पंजीकरण करने की आवश्यकता है। यह मैं क्या किया है है:क्यूटी

class blabla: public QThread 
{ 
    Q_OBJECT 
. 
. 
. 
}; 
Q_DECLARE_METATYPE(blabla) 

लेकिन इस कोड मुझे त्रुटि दे रहा है:

In copy constructor ‘QThread::QThread(const QThread&)’: 
instantiated from ‘void* qMetaTypeConstructHelper(const T*) [with T = blabla]’ 
instantiated from ‘int qRegisterMetaType(const char*, T*) [with T = blabla]’ 
instantiated from here 
‘QObject::QObject(const QObject&)’ is private 
within this context 
In file included from UnitTest.cpp:16:0: 
blabla.h: In copy constructor ‘blabla::blabla(const blabla&)’: 
note: synthesized method ‘QThread::QThread(const QThread&)’ first required here 
In file included from /usr/include/QtCore/qvariant.h:48:0, 
      from /usr/include/QtCore/qabstractitemmodel.h:45, 
      from /usr/include/QtCore/QtCore:7, 
      from /usr/include/QtTest/QtTest:3, 
      from UnitTest.h:16, 
      from UnitTest.cpp:14: 
In function ‘void* qMetaTypeConstructHelper(const T*) [with T = blabla]’: 
note: synthesized method ‘blabla::blabla(const blabla&)’ first required here 
make[1]: *** [build/obj/UnitTest.o] Error 1 

मुझे लगता है कि मैं अपने से मुलाकात प्रकार रजिस्टर करने की आवश्यकता है, लेकिन मुझे यकीन है कि जहां qRegisterMetaType<MyClass>("MyClass"); के लिए नहीं कर रहा हूँ । मैंने मेटा टाइप घोषणा मैक्रो के बाद इसे करने का प्रयास किया, लेकिन इसके परिणामस्वरूप त्रुटि हुई। किसी भी टिप्पणी या संकेत की सराहना करें जो मुझे सही रास्ते पर निर्देशित करता है।

+0

मुझे विश्वास है कि मैं सी ++ स्रोत फ़ाइल में अपनी मेटाटाइप पंजीकृत करता हूं कि जिस वर्ग के लिए मैं पंजीकरण कर रहा हूं। और cmannett85 की तरह कहा कि मैं कक्षाओं के लिए पॉइंटर्स का उपयोग वस्तुओं नहीं है। – drescherjm

उत्तर

19

ऑब्जेक्ट्स की प्रतिलिपि बनाई जाती है जब QVariant में डाल दिया जाता है, लेकिन QObject व्युत्पन्न कक्षाओं की प्रतिलिपि नहीं बनाई जा सकती है, इसलिए समाधान आपकी कक्षा में पॉइंटर का उपयोग करना है।

Q_DECLARE_METATYPE(blabla*) 

इसके अलावा qRegisterMetaType<T>() केवल पंक्तिबद्ध संकेत/स्लॉट कनेक्शन के माध्यम से अपने वस्तु भेजने के लिए आवश्यक है।

+1

चेतावनी: यह वास्तव में Q_DECLARE_METATYPE (blabla *) –

+0

@MatthiasKuhn Woops है, हाँ आप सही हैं। – cmannett85

+0

एनपी। मुझे आपका जवाब मिलने में बहुत खुशी होने के बाद इसमें भागना पड़ा। –