2010-04-01 11 views
16

मान लीजिए कि मेरे पास MyWidget है जिसमें MySubWidget है, उदा। एक कस्टम विजेट जिसमें टेक्स्ट फ़ील्ड या कुछ शामिल है। मैं चाहता हूं कि अन्य वर्ग निहित MySubWidget उदाहरण से अवगत संकेतों और स्लॉट से कनेक्ट हो सकें। यह करने के लिए पारंपरिक तरीका है:निहित विगेट्स के सिग्नल/स्लॉट को उजागर करने के लिए सही क्यूटी मुहावरे क्या है?

  1. MyWidget
  2. में एक subWidget() विधि के माध्यम से MySubWidget उदाहरण के लिए सूचक बेनकाब MyWidget कक्षा में संकेतों और MySubWidget की स्लॉट्स डुप्लिकेट और लिखना "अग्रेषण" कोड
  3. कुछ और?

विकल्प 1 कम से कम कोड की तरह लगता है, लेकिन यह भी एक तरह से टूट जाता है कैप्सूलीकरण, के बाद से अब अन्य वर्गों पता है कि MyWidget के निहित विगेट्स कर रहे हैं और उनकी कार्यक्षमता पर निर्भर हो सकता है।

चॉइस 2 ऐसा लगता है जैसे यह encapsulation रहता है, लेकिन यह बहुत ही अनावश्यक और संभावित रूप से घुलनशील कोड है जो पूरे सिग्नल और स्लॉट सिस्टम के लालित्य को गड़बड़ कर देता है।

सामान्य रूप से इस स्थिति में क्या किया जाता है?

उत्तर

16

आप क्यूटी के अपने कोड को देखें, तो वे विकल्प 2.

उदाहरण के लिए, QTabWidget और QTabBar को देखने पसंद करते हैं। वे कई सिग्नल और स्लॉट साझा करते हैं, फिर भी QTabWidget इस तथ्य को छुपाता है कि यह एक QTabBar (अच्छी तरह से, sorta ... QTabWidget::tabBar() स्पष्ट रूप से इसे तोड़ देता है भले ही यह सुरक्षित हो)।

हालांकि इसके परिणामस्वरूप अधिक कोड होगा, मुझे लगता है कि यह encapsulation के लिए इसके लायक है।

मत भूलना कि आप ऐसा जैसे संकेतों को संकेत कनेक्ट कर सकते हैं:

connect(mySubWidget, SIGNAL(internalSignal(int)), this, SIGNAL(externalSignal(int))); 

कौन सा MyWidget फेंकना externalSignal(int) जब MySubWidget का उत्सर्जन करता है internalSignal(int) कर देगा। यह कम से कम चीजों के संकेत पक्ष के साथ मदद करता है। दुर्भाग्यवश, स्लॉट्स के लिए ऐसा करने के किसी भी आसान तरीके से मुझे नहीं पता।

+0

यदि मैं उस 'सिग्नल, सिग्नल' कनेक्शन के लिए कर सकता हूं तो मैं आपको दो बार उखाड़ दूंगा। बहुत उपयोगी! –

0

मैं सिग्नल और स्लॉट के encapsulation के बारे में चिंता नहीं करेगा, संभवतः केवल एक चीज कनेक्टिंग कर रहा है, तो कुछ subclasses के बारे में जानने में क्या नुकसान है? यदि आप subWidget() विधि के दुरुपयोग को रोकने में एक बड़ी टीम पर काम कर रहे हैं तो चिंता का विषय है लेकिन आप इसे दोस्त के कीवर्ड या जो कुछ भी कर सकते हैं ...

0

आप MySubWidget की बेस क्लास का खुलासा कर सकते हैं जिसमें कम कार्यक्षमता है।

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