2011-01-24 15 views
6

क्या करी क्यूटी स्लॉट का कोई तरीका है? शायद curryng के समान कुछ है?क्यूटी स्लॉट करी

+0

तुम क्या आपके मन में है का एक उदाहरण दे सकते हैं? –

+0

http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots –

उत्तर

1

आप कुछ संकेतों को जोड़ने के लिए QSignalMapper का उपयोग कर सकते हैं और उसके बाद संलग्न कुछ पैरामीटर के साथ स्लॉट को लक्षित करने के लिए अपने स्वयं के सिग्नल कनेक्ट कर सकते हैं।

// connect signal to mapper 
signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(button1, QString("param1")); 
signalMapper->setMapping(button2, QString("param2")); 
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); 
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); 

// connect mapper signal to slot 
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &))); 
+0

मुझे लगता है कि दूसरा 'कनेक्ट' कॉल 'बटन 2' कहना चाहिए, न कि 'बटन 1'। मुझे लगता है कि यह जादू है जो इस तकनीक को उपयोगी बनाती है: सिग्नल मैपर अद्वितीय प्रेषकों को अलग-अलग प्रतिक्रिया देने के लिए। – Wyck

2

क्यूटी सिग्नल/स्लॉट का उपयोग करके बाध्यकारी तर्क संभव नहीं है। आपको कार्यक्षमता प्राप्त करने के लिए बूस्ट :: सिग्नल और बूस्ट :: बाइंड का उपयोग करना होगा।

+0

का डुप्लिकेट जैसा दिखता है LibQxt भी एक विकल्प है, मेरा उत्तर देखें। –

4

हालांकि यह क्यूटी का उपयोग करके सीधे संभव नहीं है, कुछ बाध्यकारी/करीकरण LibQxt के माध्यम से उपलब्ध है। उदाहरण के लिए और QxtBoundFunction की डॉक्स से:

अब तक, सबसे आम की उम्मीद उपयोग एक स्लॉट जब संकेत प्रस्ताव एक नहीं है के लिए एक पैरामीटर प्रदान करना है। क्यूटी के लिए नए डेवलपर इस तरह कोड लिखने का प्रयास करते हैं: \ कोड कनेक्ट (बटन, सिग्नल (क्लिक किया गया)), लाइन एडिट, एसएलओटी (सेटटेक्स्ट ("हैलो, वर्ल्ड")); \ endcode अनुभवी क्यूटी डेवलपर्स तुरंत यहां दोष दिखाएंगे। ठेठ समाधान एक छोटा, एक-पंक्ति रैपर स्लॉट बनाना है जो वांछित फ़ंक्शन को आमंत्रित करता है। कुछ चालाक डेवलपर्स स्लॉट्स को संभालने के लिए QSignalMapper का भी उपयोग कर सकते हैं जिन्हें केवल एक int या QString पैरामीटर की आवश्यकता होती है।

QxtBoundFunction सक्षम बनाता है पिछले कनेक्ट बयान इस तरह लिखा होना चाहिए: \ कोड कनेक्ट (बटन, सिग्नल (क्लिक किया()), QxtMetaObject :: बाँध (lineEdit, स्लॉट (setText (QString)), Q_ARG (QString , "नमस्ते दुनिया!"))); \ कोड यह एक निरंतर मूल्य को पास करने के लिए, एक नया स्लॉट, या बदतर, एक संपूर्ण ऑब्जेक्ट बनाने के बिना एक ही परिणाम प्राप्त करता है।

साथ ही, QXT_BIND मैक्रो के उपयोग के माध्यम, संकेत से पैरामीटर, पुन: व्यवस्थित किया जा सकता है को छोड़ दिया, या Q_ARG मैक्रो के साथ प्रदान की निरंतर तर्कों के साथ पारित कर दिया। इसका उपयोग उदाहरण के लिए जेनेरिक फ़ंक्शन पर राज्यव्यापी कॉलबैक प्रदान करने के लिए किया जा सकता है।

कई प्रकार के कार्यों को बाध्य किया जा सकता है। सबसे आम बाध्यकारी क्यूटी संकेतों और स्लॉट पर लागू होता है, लेकिन मानक सी/सी ++ कार्यों को भी बाध्य किया जा सकता है। भविष्य के विकास सी ++ सदस्य कार्यों, से जुड़ने की क्षमता जोड़ सकते हैं और यदि आवश्यक हो तो डेवलपर्स लचीलापन के लिए कस्टम QxtBoundFunction सबक्लास बना सकते हैं।

हालांकि मैंने लिबकैक्स्ट में कुछ पैच सबमिट किए हैं, मैंने इसका उपयोग सीधे नहीं किया है, इसलिए आपका माइलेज भिन्न हो सकता है।

0
बेशक

, अब हम क्यूटी 5 है और मनमाने ढंग से प्रतिदेय वस्तुओं के लिए संकेत कनेक्ट करने की क्षमता:

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg)); 

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); }); 
संबंधित मुद्दे