2012-12-21 24 views
7

मैं एक समस्या में भाग गया कि मुझे मैप किए गए स्रोत सिग्नल के पैरामीटर रखने की आवश्यकता है। अब तक मुझे केवल पैरामीटर के बिना सिग्नल मैप करने के लिए उदाहरण मिलते हैं। उदाहरण के लिए, क्लिक किए गए() संकेत:QSignalMapper का उपयोग करते समय स्रोत सिग्नल के पैरामीटर कैसे रखें?

signalMapper = new QSignalMapper(this); 
signalMapper->setMapping(taxFileButton, QString("taxfile.txt")); 

connect(taxFileButton, SIGNAL(clicked()), 
    signalMapper, SLOT (map())); 

connect(signalMapper, SIGNAL(mapped(QString)), 
    this, SLOT(readFile(QString))); 

हालांकि, मैं क्लिक किए गए (bool) संकेत अपने स्वयं के मानकों के साथ कुछ संकेत मैप करने के लिए, उदाहरण के लिए की आवश्यकता होगी, तो स्लॉट दो तर्क doStuff (की आवश्यकता है बूल, क्यूस्ट्रिंग):

connect(taxFileButton, SIGNAL(clicked(bool)), 
    signalMapper, SLOT (map())); 

connect(signalMapper, SIGNAL(mapped(QString)), 
    this, SLOT(doStuff(bool,QString))); 

हालांकि, यह इस तरह काम नहीं करता है? क्या कोई काम आसपास है?

धन्यवाद!

उत्तर

7

QSignalMapper सिग्नल पैरामीटर पास करने के लिए कार्यक्षमता प्रदान नहीं करता है।
इस वर्ग parameterless संकेतों का एक सेट जमा करता है, और उन्हें पूर्णांक, स्ट्रिंग या वस्तु है कि संकेत भेजा करने के लिए इसी विजेट मानकों के साथ फिर से उत्सर्जन करता है:

दस्तावेज़ देखें।

है कि हल करने के लिए तरीके हैं:

क्यूटी 4 प्रयोग किया जाता है तो मैं जो मापदंडों आपको क्या चाहिए समर्थन करता है, अपने स्वयं के संकेत नक्शाकार लागू करने के लिए सुझाव देना चाहेंगे।
QSignalMapper implementation शुरू करने के लिए एक अच्छा उदाहरण होगा।

लेकिन यदि Qt5 का उपयोग किया जाता है तो आप बिल्कुल ठीक कर सकते हैं जो आपको बिना QSignalMapper उपयोग के बिना चाहिए। बस लैम्ब्डा करने के लिए संकेत कनेक्ट:

connect(taxFileButton, &TaxFileButton::clicked, [this](bool arg) { 
    doStuff(arg, "taxfile.txt"); 
} ); 

मुझे लगता है taxFileButtonTaxFileButton वर्ग के उदाहरण है।

यदि सी ++ 11 लैम्ब्डा किसी कारण से उपयुक्त नहीं है तो tr1::bindthis और "taxfile.txt" मानों को बांधने के लिए उपयोग किया जा सकता है।
कृपया ध्यान दें कि this ऑब्जेक्ट नष्ट होने पर ऐसा कनेक्शन स्वचालित रूप से डिस्कनेक्ट नहीं होगा। अधिक जानकारी here हैं।

+0

तो मेरे अपने मैपर वर्ग को लागू करने के अलावा Qt4 में ऐसा करने का कोई आसान तरीका नहीं है? – Wang

+2

मुझे भी आसान तरीका मिलकर खुशी होगी :)। अब मेरे प्रोजेक्ट में इसी तरह का कार्य Qt4 के लिए वर्णित तरीके से हल किया गया है। –

+0

बहुत अच्छा। मुझे एक सरणी डेटा संरचना (एक्स और वाई इंडेक्स) में विभिन्न नियंत्रणों को मैप करने के लिए QLineEdit :: textEdited ईवेंट के लिए इसकी आवश्यकता थी। तो ... कनेक्ट करें (लाइन एडिट, और QLineEdit :: टेक्स्ट एडिट, [यह] (कॉन्स क्यूस्ट्रिंग और स्ट्र) {ऑन चेंज (एक्स, वाई, स्ट्र);}); –