2009-09-28 11 views
6

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

मेरे पास एक कक्षा है, चलिए कहें कि अपने स्वयं के स्लॉट और सिग्नल होने की आवश्यकता है, लेकिन QXmlDefaultHandler से भी उत्तराधिकारी होने की आवश्यकता है (बल्कि अजीब लगता है, लेकिन मुझे सीधे इस वेबसाइट का सामना करने के लिए QHttp का उपयोग करने की कोशिश करते समय इस स्थिति का सामना करना पड़ा एक क्यूबफर)।

class foo: public QXmlDefaultHandler, public QObject 
{ 
    public: 
     foo(); 
     ~foo(); 

     Q_OBJECT 
    public slots: 
     void bar(); 
} 

इस कोड है, अगर एक सीपीपी के साथ कहीं और एक संकेत करने के लिए बार कनेक्ट करने के लिए, संकलन नहीं होंगे। QObject के कुछ सदस्यों के बारे में आपको QXmlDefaultHandler का सदस्य नहीं होने के बारे में त्रुटियां मिलेंगी। इसके अतिरिक्त, आप Q_OBJECT को स्थानांतरित नहीं कर सकते हैं या अन्यथा आपको कुछ चीजों को लागू नहीं करने के लिए vtable त्रुटियां मिलती हैं (आगे बढ़ें! इसे आज़माएं!)।

कृपया (बहुत सरल) फिक्स के लिए मेरा उत्तर देखें। यदि मैं सोचता हूं कि आप इसे मुझसे बेहतर समझाते हैं तो मैं आपको स्वीकार किए गए उत्तर के रूप में वोट देने का मनोरंजन करूंगा।

संपादित करें: आपके लिए सी ++ और क्यूटी vets, अगर आप इसे बेहतर समझा सकते हैं तो कृपया एक उत्तर पोस्ट करें। मैंने इस जानकारी को देखकर काफी समय बिताया, इसलिए अगर आप मुझसे बेहतर कर सकते हैं तो कृपया किसी और की मदद करें।

उत्तर

12

documentation for moc कहा गया है कि बहु उत्तराधिकार के मामलों में, वर्ग QObject प्रदान दिखाई देनी चाहिए पहले

आप एकाधिक वंशानुक्रम का उपयोग कर रहे हैं, तो MOC मान लिया गया पहला विरासत में मिला है कि वर्ग QObject का एक उपवर्ग है। इसके अलावा, सुनिश्चित करें कि केवल पहले विरासत में कक्षा एक QObject है। QObject साथ

// correct 
class SomeClass : public QObject, public OtherClass 
{ 
    ... 
}; 

आभासी विरासत समर्थित नहीं है।

2
class foo: public QObject, public QXmlDefaultHandler 
{ 
    public: 
     foo(); 
     ~foo(); 
    Q_OBJECT 
    public slots: 
     void bar(); 
} 

जितना आसान लगता है, अगर आप विरासत सूची में पहले QObject नहीं डालते हैं, तो यह कार्य असंभव है। यह क्यूटी के मेटा ऑब्जेक्ट सिस्टम में एक सीमा है। यदि आप ऐसा नहीं करते हैं, तो संकलक QXmlDefaultHandler के हिस्से के रूप में QObject के कुछ सदस्यों को लागू करने का प्रयास करेगा।

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