[PyKDE] Pythons slots?  how?
    Burley, Brent 
    Brent.Burley at disney.com
       
    Wed Sep  4 00:11:01 BST 2002
    
    
  
Is it possible to define a new slot in python?  I know I can connect a Qt signal to a python callable via QObject.connect(), but is it possible to define a true Qt slot that can be referenced in other situations?
In particular, I'd like to make a menu where each item calls a different method:
from qt import *
import sys
class FruitMenu(QPopupMenu):
    def __init__(self):
        QPopupMenu.__init__(self)
        self.insertItem('apple', self, SLOT('apple()'))
        self.insertItem('orange', self, SLOT('orange()'))
    def apple(self): print 'apple'
    def orange(self): print 'orange'
app = QApplication(sys.argv)
main = QMainWindow()
fm = FruitMenu();
main.menuBar().insertItem('fruit', fm)
main.show()
app.setMainWidget(main)
app.exec_loop()
But this doesn't work since apple and orange are not Qt slots.  And I can't use QObject connect in this context since I can't get at the signal for each individual menu item.  The only way I know to make this work is to connect to the generic 'activated' signal:
class FruitMenu(QPopupMenu):
    def __init__(self):
        QPopupMenu.__init__(self)
        self.apple_id = self.insertItem('apple')
        self.orange_id = self.insertItem('orange')
        QObject.connect(self, SIGNAL('activated(int)'), self.handleChoice)
    def handleChoice(self, id):
        if id == self.apple_id: self.apple()
        elif id == self.orange_id: self.orange()
    def apple(self): print 'apple'
    def orange(self): print 'orange'
This method works, but it's a little more cumbersome, especially when the menu is large and/or dynamic.
Thanks,
	Brent Burley
    
    
More information about the PyQt
mailing list