2012-03-25 8 views
12

स्लॉट्स को सिग्नल कनेक्ट करने के लिए, जहां तक ​​मुझे पता है, सिग्नल के पैरामीटर स्लॉट के पैरामीटर से मेल खाने की आवश्यकता है। उदाहरण के लिए:निरंतर मानों के साथ स्लॉट पर सिग्नल कनेक्ट करें

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

लेकिन क्या होगा अगर मैं एक संकेत कॉल एक स्लॉट मानकों का एक अलग राशि है कि करने के लिए है, लेकिन हमेशा स्लॉट में एक निरंतर मूल्य पारित करना चाहते हैं।

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

या दूसरे शब्दों में, जब भी बटन दबाया जाता है, यह गलत पैरामीटर के साथ setDockWidget() फ़ंक्शन को कॉल: उदाहरण के लिए, कोड की ऊपर टुकड़ा का उपयोग कर। क्या यह संभव है?

उत्तर

8

नहीं, यह संभव नहीं है। आपको सिग्नल को कम सिग्नल की तुलना में कम या समान तर्क गणना के साथ कनेक्ट करने की अनुमति है। (documentation देखें)

आपको प्रॉक्सी स्लॉट बनाना है, जो वांछित कॉल करेगा।

+1

यह उत्तर अब वास्तव में मान्य नहीं है, क्योंकि C++ 11 पर Qt5 वाक्यविन्यास इस उद्देश्य के लिए लैम्ब्डा का उपयोग करना काफी आसान बनाता है। –

+1

@ एंड्रे, दूसरी तरफ, आप सिर्फ 'प्रॉक्सी स्लॉट बना सकते हैं, जो वांछित कॉल करेगा।' अब – Lol4t0

+1

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

6

एक तरह से, हाँ, आप कर सकते हैं। लेकिन यह बहुत शक्तिशाली नहीं है: केवल setDockWidget इस तरह की घोषणा:

[virtual] void setDockWidget(bool state=false) ; 

और कनेक्शन इस तरह की घोषणा:

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidget तर्क के बिना बुलाया डिफ़ॉल्ट वाले ले।

8

आप लगातार तर्क साथ वांछित कॉल साथ लैम्ब्डा उपयोग कर सकते हैं। उदाहरण: https://wiki.qt.io/New_Signal_Slot_Syntax:

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

नई कनेक्ट सिंटैक्स के बारे में अधिक।

+0

आपके मामले में चर के साथ लगातार तर्क मिश्रण करना संभव है? –

+0

@AlekseyKontsevich: यदि मैं आपको सही ढंग से समझता हूं, तो आप सिग्नल से स्लॉट तक एक वैरिएबल पास करना चाहते हैं? जरूर आप कर सकते हो। इसे लैम्ब्डा के लिए तर्क दें और फ़ंक्शन आमंत्रण में उस तर्क का उपयोग करें। हालांकि, मैं आपको 'तर्क' के साथ संदर्भ तर्क का उपयोग करने की सलाह देता हूं। इस तरह, आप सुनिश्चित कर सकते हैं कि प्राप्त करने वाली वस्तु नष्ट हो जाने पर कनेक्शन नष्ट हो गया है। अन्यथा, आप अपरिभाषित व्यवहार में समाप्त हो सकते हैं। –

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