2009-09-23 9 views
6

पर क्लिक किया गया मुझे यह जानने में सक्षम होना चाहिए कि मैंने गतिशील रूप से जेनरेट किए गए मेनू सिस्टम में किस आइटम पर क्लिक किया है। मैं केवल यह जानना चाहता हूं कि मैंने क्या क्लिक किया है, भले ही यह केवल एक स्ट्रिंग प्रस्तुति है।पायकट - क्यूमेनू गतिशील रूप से पॉप्युलेट और

def populateShotInfoMenus(self): 
    self.menuFilms = QMenu() 
    films = self.getList() 

    for film in films: 
     menuItem_Film = self.menuFilms.addAction(film) 
     self.connect(menuItem_Film, SIGNAL('triggered()'), self.onFilmSet) 
     self.menuFilms.addAction(menuItem_Film) 

def onFilmRightClick(self, value): 
    self.menuFilms.exec_(self.group1_inputFilm.mapToGlobal(value)) 

def onFilmSet(self, value): 
    print 'Menu Clicked ', value 

उत्तर

11
इसके बजाय onFilmSet सीधे का उपयोग कर अपने कनेक्शन की रिसीवर के रूप में की

, एक लैम्ब्डा फ़ंक्शन का उपयोग करें ताकि आप अतिरिक्त पैरामीटर पारित कर सकते हैं:

receiver = lambda film=film: self.onFilmSet(self, film) 
self.connect(menuItem_Film, SIGNAL('triggered()'), receiver) 
+0

ठीक है जो मैं खोज रहा था, आह मिठाई लैम्ब्डा! – crackerbunny

1

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

लेकिन, ऐसा करने का यह सबसे अच्छा तरीका नहीं है। प्रेषक() का उपयोग करने की सलाह नहीं दी जाती है क्योंकि यह मॉड्यूलरिटी के ऑब्जेक्ट उन्मुख सिद्धांत का उल्लंघन करती है।

सबसे अच्छा तरीका QSignalMapper क्लास का उपयोग करेगा। यह वर्ग अलग-अलग ऑब्जेक्ट्स के साथ अलग-अलग ऑब्जेक्ट्स के समान स्लॉट पर संकेत करता है।

मैंने पीईक्यूटी का उपयोग नहीं किया है इसलिए मैं आपको सटीक वाक्यविन्यास या उदाहरण नहीं दे सकता, लेकिन थोड़ा सा शोध ढूंढना मुश्किल नहीं होना चाहिए।

+0

मैं मानता हूं कि यह सिग्नल मैपर का उपयोग करने के लिए जगह की तरह लगता है। –

1

मैं एक समान समस्या का पता लगाने की कोशिश कर रहा था और इसके ऊपर दिए गए कोड को देखने के बाद मेरे लिए क्या काम किया गया। सोचा कि यह सब एक साथ दिखाने के लिए अच्छा होगा। =)

self.taskMenu = QtGui.QMenu("Task") 
self.tasks = self.getTasks() #FETCHES A LIST OF LIST 
self.menuTasks = QtGui.QMenu() 
for item in self.tasks: 
    menuItem_Task = self.taskMenu.addAction(item[1]) 
    receiver = lambda taskType=item[0]: self.setTask(taskType) 
    self.connect(menuItem_Task, QtCore.SIGNAL('triggered()'), receiver) 
    self.taskMenu.addAction(menuItem_Task) 

def setTask(self,taskType): 
    print taskType 
1

बस कुछ अतिरिक्त जानकारी, मैं क्यों नहीं पता है, लेकिन लैम्ब्डा समारोह कनेक्शन के लिए नई PyQt वाक्य रचना के साथ काम नहीं करता है:

कोड का उदाहरण काम नहीं कर रहा:

self.contextTreeMenuAssignTo = QtGui.QMenu(self) 
    actionAssign = contextMenu.addMenu(self.contextTreeMenuAssignTo) 
    actionAssign.setText("Assign to : ") 
    for user in self.whoCanBeAssignated() : 
     actionAssignTo = QtGui.QAction(user[0] ,self) 
     self.contextTreeMenuAssignTo.addAction(actionAssignTo) 
     actionAssignTo.triggered.connect( lambda userID = user[1] : self.assignAllTo(userID) ) 

लेकिन आप पुरानी शैली कनेक्शन वाक्य रचना के साथ अंतिम पंक्ति subsitute यदि:

self.connect(actionAssignTo, QtCore.SIGNAL('triggered()'), lambda userID = user[1] : self.assignAllTo(userID) )  

सबकुछ ठीक है। नया कनेक्शन वाक्य रचना के साथ, आप केवल पाश :(

+0

मेरे लिए (क्यूटी 4) यह भी नए कनेक्शन सिंटैक्स के साथ काम करता है, मेरी टिप्पणी देखें इस उत्तर में: http://stackoverflow.com/a/1102089/3224008 – Leistungsabfall

1

मैं this जवाब यहाँ PyQt5 में इस मुद्दे से निपटने के लिए मिल गया के अंतिम तत्व मिलता है, python3। मुझे यह पसंद नहीं है, bVal चर सटीक होना करने के लिए , के रूप में मैं पूरी तरह से यह समझ में नहीं आता है, लेकिन यह एक लंबे समय तो लगता है मैंने सोचा कि मैं इसे यहाँ साझा करते हैं लिया। bVal अप बूलियन मान चालू होने से उठाता है और taskType पारित होने के लिए अनुमति देता है।

self.taskMenu = QtGui.QMenu("Task") 
self.tasks = self.getTasks() #FETCHES A LIST OF LIST 
self.menuTasks = QtGui.QMenu() 

for item in self.tasks: 
    menuItem_Task = self.taskMenu.addAction(item[1]) 
    receiver = lambda: bVal, taskType=item: self.setTask(bVal, taskType) 
    menuItem_Task.triggered.connect(receiver) 
    self.taskMenu.addAction(menuItem_Task) 

def setTask(self, ignore_bVal, taskType): 
    print taskType 
+0

आपको 'bVal' को 'setTask' में पास करने की आवश्यकता नहीं है, ताकि आप उस बदसूरत' ignore_bVal' से छुटकारा पा सकें। एकमात्र आवश्यकता यह है कि आप 'लैम्ब्डा' में प्रारंभिक तर्क डालते हैं ताकि 'टास्कटाइप' तर्क को बूलियन मान के साथ ओवरराइट नहीं किया जा सके। 'बीवल' को '* args' के साथ प्रतिस्थापित करने के लिए थोड़ा अधिक मजबूत (और अधिक सामान्य) समाधान होगा - जो सिग्नल द्वारा भेजे गए सभी संभावित * मानों को अनदेखा कर देगा, और कीवर्ड तर्कों को छूटेगा। – ekhumoro

+0

मैं इस जवाब के लिए Python3 और PyQt5 के साथ एक समान समस्या को हल करने में सक्षम था। इस विचार को यहां भी देखा जा सकता है: https: // github।com/मुअम्मर/mkchromecast/प्रतिबद्ध/719fde94e271f97a2047e84b56d7603a5d8cde09 – muammar

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