2009-06-02 9 views
27

से कनेक्ट कर रहा। अब समस्या यह है कि मैं जानना चाहता हूं कि कौन सा मेनू आइटम क्लिक किया गया था, लेकिन मुझे नहीं पता कि उस जानकारी को उस फ़ंक्शन में कैसे भेजा जाए। यहाँ कार्य करने के लिए कार्रवाई कनेक्ट करने के लिए प्रयोग किया जाता है:PyQt स्लॉट के लिए पैरामीटर भेज जब मैं एक टास्कबार मेनू जो क्लिक एक स्लॉट है कि ट्रिगर घटना हो जाता है से जुड़ा है एक संकेत

QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc) 

मुझे पता है कि कुछ घटनाओं कोई मान है, लेकिन चालू होने() नहीं है। तो मैं यह कैसे करूं? क्या मुझे अपना सिग्नल बनाना है?

उत्तर

40

उपयोग एक lambda

यहाँ PyQt book से एक उदाहरण है:

self.connect(button3, SIGNAL("clicked()"), 
    lambda who="Three": self.anyButton(who)) 

वैसे, आप भी functools.partial उपयोग कर सकते हैं, लेकिन मैं lambda विधि आसान और अधिक स्पष्ट पाते हैं।

+0

अरे, बहुत बहुत धन्यवाद! पूरी तरह से मुझे निराशा की बहुत बचाई। मुझे शायद उस पुस्तक को पकड़ना चाहिए ... – johannix

+1

आपको वास्तव में करना चाहिए - यह एक बहुत अच्छी किताब है। –

+0

भयानक जवाब है, यह वास्तव में क्या मैं – Bedros

0

सामान्यतः, आपके पास प्रत्येक मेनू आइटम को एक अलग स्लॉट से कनेक्ट होना चाहिए, और प्रत्येक स्लॉट केवल अपने स्वयं के मेनू आइटम के लिए कार्यक्षमता को संभाल लेता है। उदाहरण के लिए, यदि आपके पास "सेव", "क्लोज़", "ओपन" जैसे मेनू आइटम हैं, तो आपको प्रत्येक के लिए एक अलग स्लॉट बनाना चाहिए, इसमें एक केस स्टेटमेंट के साथ एक स्लॉट रखने की कोशिश न करें।

यदि आप इसे इस तरह से नहीं करना चाहते हैं, तो आप QObject::sender() फ़ंक्शन का उपयोग प्रेषक को पॉइंटर प्राप्त करने के लिए कर सकते हैं (यानी: सिग्नल उत्सर्जित करने वाला ऑब्जेक्ट)। मैं जो कुछ हासिल करने की कोशिश कर रहा हूं उसके बारे में कुछ और सुनना चाहता हूं।

+3

लिए देख रहा था ओ पी एक पूरी तरह से वैध आवश्यकता के बारे में पूछ रहा है। कभी-कभी कई मेनू आइटम स्वत: जेनरेट होते हैं (या बस बहुत समान होते हैं) और उसी स्लॉट को संदर्भित करना चाहिए। पीईक्यूटी में इसे हासिल करने का एक मानक तरीका है जिसे पुस्तक और ट्यूटोरियल्स में अनुशंसित किया जाता है। –

7

जैसा कि पहले ही उल्लेख किया here आप विधि आप निष्पादित करने के लिए चाहते हैं के लिए अतिरिक्त तर्क पारित करने के लिए लैम्ब्डा समारोह का उपयोग कर सकते हैं।

इस उदाहरण में आप बटन दबाए जाने पर फ़ंक्शन AddControl() को स्ट्रिंग ओबीजे पास कर सकते हैं।

# Create the build button with its caption 
self.build_button = QPushButton('&Build Greeting', self) 
# Connect the button's clicked signal to AddControl 
self.build_button.clicked.connect(lambda: self.AddControl('fooData')) 
def AddControl(self, name): 
    print name 

स्रोत: snip2code - Using Lambda Function To Pass Extra Argument in PyQt4

3

उपयोग functools.partial

अन्यथा आप आप तर्क गतिशील रूप से पारित नहीं कर सकते हैं अगर आप लैम्ब्डा उपयोग करते हैं, स्क्रिप्ट चल रही है मिल जाएगा।

+2

कुछ सबूत के साथ इसे वापस करने के लिए देखभाल? – ekhumoro

+0

आप बहुत अच्छी तरह से तर्क गतिशील रूप से एक बनाया लैम्ब्डा में, (सामान्य 'def''ed कार्यों की तरह) पारित कर सकते हैं lambdas के रूप में बंद कर रहे हैं और इस प्रकार उनके enclosing दायरे से बाइंडिंग पर कब्जा। (हां, यह भी मतलब है एक तीसरा विकल्प के रूप में आप इस्तेमाल कर सकते हैं कि एक स्थानीय रूप से 'def''ed समारोह गतिशील रूप से इसे करने के लिए पैरामीटर भेजने _AND_।) इसके अलावा, भूल नहीं है कि आप डिफ़ॉल्ट तर्कों का उपयोग उनमें से _both_ के लिए डायनामिक मान पारित करने के लिए कर सकते हैं । हालांकि, यह कहकर, व्यक्तिगत रूप से मैं 'functools पसंद करते हैं।आंशिक 'भी, मेरा स्वयं का कारण यह है कि यह' लैम्ब्डा 'से अधिक हल्का लगता है (बिना दावा किए कि यह वास्तव में है)। – blubberdiblub

0

मैं भी जोड़ने के लिए है कि आप sender विधि का उपयोग कर सकते हैं अगर आप सिर्फ पता लगाने के लिए क्या संकेत भेजा विजेट की जरूरत चाहते हैं। उदाहरण के लिए:

def menuClickedFunc(self): 
    # The sender object: 
    sender = self.sender() 
    # The sender object's name: 
    senderName = sender.objectName() 
    print senderName