2009-05-10 10 views
11

मैं क्यूटी के साथ प्रोग्रामिंग के लिए अपेक्षाकृत नया हूं और एक प्रश्न था। लघु संस्करण:क्यूटी संकेत और विरासत प्रश्न

मैं सुपरक्लास में परिभाषित संकेतों का वारिस कैसे प्राप्त करूं?

मैं किसी और की अच्छी तरह से किया जाता QTWidgets उपवर्ग के लिए डिफ़ॉल्ट व्यवहार के कुछ बदलने के लिए कोशिश कर रहा हूँ:

 

//Plot3D is a QWidget that defines a signal "rotationChanged" 
class matLinePlot : public QObject, public Plot3D { 

    Q_OBJECT; 
     //etc... 
public: 
     //etc... 

     //Catch Plot3D's signal "rotationChanged" and do some magic with it: 
    void initPlot(){ 
       QObject::connect(this, SIGNAL(rotationChanged(double , double , double)), 
      this, SLOT(myRotationChanged(double, double, double))); 
    } 
}; 

समस्या QObject :: कनेक्ट कतार में है। मैं क्या करना चाहता हूं रोटेशन चेंग्ड सिग्नल (qwt3D_plot.h से) को स्थानीय फ़ंक्शन/एसएलओटी - "myRotationChanged" से कनेक्ट करना है। हालांकि जब भी मैं इसे करता हूं, रन टाइम पर मुझे मिलता है:

Object::connect: No such signal matLinePlot::rotationChanged(double, double, double)

सी में: ... \ matrixVisualization.h। बेशक, मुझे पता है कि rotationChangedmatrixVisualization.h में नहीं है - यह qwt_plot3D.h में है, लेकिन मैंने सोचा कि चूंकि मैं Plot3D से उत्तराधिकारी हूं, सबकुछ ठीक होना चाहिए। लेकिन, अब जब मैं इसके बारे में सोचता हूं, चूंकि सिग्नल और एसएलओटी मैक्रोज़ हैं, तो मुझे लगता है कि MOC विरासत के बारे में नहीं जानता/देखभाल नहीं करता है।

जो मुझे मेरे प्रश्न पर ले जाता है - चूंकि एमओसी और सिग्नल/एसएलओटीएस विरासत आदि के बारे में नहीं जानते हैं: मैं कहीं और परिभाषित विजेट को कैसे विभाजित कर सकता हूं और विजेट के सिग्नल तक पहुंच प्राप्त कर सकता हूं?

मेरे पास इस तरह कुछ करने के लिए encapsulation का उपयोग करने के कई उदाहरण हैं, लेकिन मुझे डर है कि मुझे यह समझ में नहीं आता कि विरासत के साथ ऐसा कैसे किया जाए।

क्षमा करें अगर यह एक हास्यास्पद प्रश्न है - मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है।

+1

"matrixVisualization.h" में त्रुटि में दिखाई देने वाला संदर्भ दिखाता है कि कौन सी फ़ाइल विफल हुई QObject :: कनेक्ट है, जहां यह मिलान सिग्नल के लिए "देखने" की कोशिश नहीं कर रहा है। –

उत्तर

9

मुझे लगता है कि समस्या एकाधिक वंशानुक्रम है:

class matLinePlot : public QObject, public Plot3D 
... 

मुझे लगता है कि Plot3D एक है QObject का उप-वर्ग? इस मामले में, आपको

class matLinePlot : public Plot3D 
... 

इसके बजाय करना चाहिए।

+1

एक लिंक त्रुटि में बातें करता है कि: 1> moc_matrixVisualization.obj: LNK2001 त्रुटि: अनसुलझे बाह्य प्रतीक "सार्वजनिक: स्थिर struct QMetaObject स्थिरांक Qwt3D :: Plot3D :: staticMetaObject"? (StaticMetaObject @ Plot3D @ Qwt3D @@ 2UQMetaObject @@ बी) क्यूटी दस्तावेज़ कई विरासत का उपयोग करने का सुझाव देता है: http://doc.trolltech.com/4.3/uitools-multipleinheritance.html हालांकि वे QWIdget का विस्तार करते हैं, मुझे QObject की आवश्यकता है। – Pete

+2

आपके द्वारा पोस्ट किया गया लिंक .ui फ़ाइलों (Qt Designer द्वारा बनाई गई फ़ाइलों) का उपयोग करने के तरीके पर एक उदाहरण दिखा रहा है। एक महत्वपूर्ण अंतर यह है कि उई :: कैलक्यूलेटरफॉर्म QObject का उप-वर्ग नहीं है। नियम जब QObject (और एकाधिक विरासत का उपयोग करके) से उपclassing है कि सुपरक्लास में से केवल एक QObject हो सकता है और QObject विरासत में पहला हिस्सा होना चाहिए। – ashcatch

+1

डॉक्टर एक अलग परिदृश्य में एकाधिक विरासत का सुझाव देता है। क्यूटी डिजाइनर का उपयोग करते समय आपको एक .ui फ़ाइल मिल जाएगी, फिर यूआईसी नामक एक उपकरण उस .ui फ़ाइल को ले जाएगा और मूल रूप से .ui फ़ाइल का अनुवाद है जो मूल रूप से .ui फ़ाइल का अनुवाद है। तो वे मूल रूप से सुझाव दे रहे हैं कि वह उस वर्ग से उत्तराधिकारी है, इसे सदस्य के रूप में रखने के बजाय। –

1

मुझे विश्वास है कि प्लॉट 3 डी :: रोटेशन चेंज सिग्नल सार्वजनिक या संरक्षित होने पर काम करेगा। क्या आप वाकई निजी नहीं हैं?

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

हालांकि मैं एक विशिष्ट संदर्भ नहीं मिल सकता है, मैं यह निष्कर्ष निकला कि संकेत हमेशा सार्वजनिक कर रहे हैं होगा। कम से कम एक परीक्षण मैंने यहां संकेत दिया था कि अगर मैं कक्षा के निजी वर्ग में घोषित किया गया था तो भी मैं एक संकेत से कनेक्ट कर सकता था।

मैंने यह भी सत्यापित किया कि QObject में घोषित एक सिग्नल कनेक्ट स्टेटमेंट में QObject के उप-वर्ग का उपयोग करके कनेक्ट किया जा सकता है, इसलिए सिग्नल निश्चित रूप से विरासत योग्य होते हैं। जैसा कि मैं यहां अन्य उत्तरों और टिप्पणियों में देखता हूं, यह मुद्दा कहीं और होना चाहिए।

+0

हाय, मैं संकेत कीवर्ड से पहले एक सार्वजनिक कीवर्ड डालने की कोशिश की, लेकिन क्यूटी एमओसी कि पसंद नहीं आया: 1> एमओसी शामिल \ qwt3d_plot.h 1> \ qwt3d_plot.h (143) शामिल हैं: त्रुटि: सिग्नल नहीं कर सकते एक्सेस स्पेयर 1> प्रोजेक्ट: त्रुटि PRJ0019: एक टूल ने "एमओसी में \ qwt3d_plot.h" – Pete

+0

ओप्स से एक त्रुटि कोड लौटाया। जाहिर है, मुझे "सार्वजनिक: संकेत:" का उपयोग करना चाहिए था, लेकिन इससे मदद नहीं मिली है। – Pete

0

गलत -> टिप्पणियां देखें।

मैं यूनी में कूपिया का उपयोग कर रहा हूं और मुझे विश्वास है कि मुझे किसी को कनेक्ट करने के लिए सिग्नल और एसएलओटी पैरामीटर में अंतर के बारे में कुछ कहने को याद है।

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)), 
      this, SLOT(myRotationChanged(double,double,double))); 

मैं जानता हूँ कि यह सहज नहीं लगता है, के रूप में सी ++ खाली स्थान के के प्रति संवेदनशील नहीं है उपयोग करने का प्रयास है, तथापि मेरा मानना ​​है कि यह जादू है कि Qtopia/क्यूटी उपयोग करता है जब से कुछ के साथ कुछ करने के लिए है सिग्नल और स्लॉट कनेक्टिंग। यह केवल कूपिया पर लागू हो सकता है, या मैंने गलत सुना होगा, लेकिन इसे आज़माएं। इसके अतिरिक्त सिग्नल सार्वजनिक या संरक्षित हैं और क्या आपने उचित हेडर फाइलें शामिल की हैं?

+0

अब मेरे पास है: सार्वजनिक: संकेत: \t \t //! उत्सर्जित, यदि घूर्णन बदल गया है शून्य रोटेशन चेंज (डबल xAngle, डबल yAngle, डबल zAngle); शीर्षक और साजिश रचने लाइब्रेरी में, और QObject :: कनेक्ट (यह संकेत (rotationChanged (डबल, डबल, डबल)), \t \t इस, स्लॉट (myRotationChanged (डबल, डबल, डबल))); मेरी व्युत्पन्न कक्षा में ... अभी भी एक ही त्रुटि है। मैंने हेडर शामिल किया है: # शामिल // प्लॉट 3 डी कक्षा – Pete

+0

है जब आप सिग्नल घोषित करते हैं, पैरामीटर के लिए नाम घोषित न करें, केवल प्रकार। यह सार्वजनिक है: सिग्नल: शून्य रोटेशन चेंज (डबल, डबल, डबल); उम्मीद है कि आपकी त्रुटि को ठीक करना चाहिए। – mdec

+0

स्पेसिंग सिग्नल और स्लॉट को प्रभावित नहीं करता है, जो आपने सुना है वह सिग्नल/स्लॉट सामान्यीकरण है जो कोड को थोड़ा सा गति देता है लेकिन यह शायद ही कभी उल्लेखनीय है। – ismail

2

सिग्नल (एक्स) और एसएलओटी (एक्स) स्ट्रिंग अक्षर उत्पन्न करने वाले मैक्रोज़ हैं। रनटाइम पर, स्लॉट और सिग्नल उन जेनरेट किए गए अक्षर की स्ट्रिंग तुलनाओं का उपयोग करके मेल खाते हैं।

(मैं mdec की टिप्पणी पर कोई टिप्पणी जोड़ी होता, लेकिन मैं काफी प्रतिनिधि नहीं है)

+0

सही - मुझे लगता है कि यह इस समस्या का दिल है; क्योंकि स्ट्रिंग मिलान मैक्रो/एमओसी कॉम्बो सिग्नल के लिए केवल वर्तमान हेडर फ़ाइल में देख रहा है, यह संकलित कोड की मेरी अन्य लाइब्रेरी को देखने के बारे में नहीं जानता है। – Pete

+0

पीट, मुझे यकीन है कि आप गलत हैं। सिग्नल और स्लॉट कहीं भी रखा जाता है (moc इसके लिए कोड उत्पन्न करता है, आप इसे * _moc फ़ाइल में देख सकते हैं), इसका वर्तमान हेडर फ़ाइल से कोई लेना देना नहीं है। –

+0

(शाप! - मेरे पास लिंक त्रुटि के बारे में पीट की आखिरी टिप्पणी में जोड़ने के लिए पर्याप्त प्रतिनिधि नहीं है) ऐसा लगता है कि आप moc_qwt3D_plot.cpp में लिंक नहीं कर रहे हैं। –

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