[PyKDE] "sender" info in Python slot

Jeremy Sanders jeremy at jeremysanders.net
Thu Nov 9 20:38:58 GMT 2006


On Thu, 9 Nov 2006, Andreas Pakulat wrote:

> On 09.11.06 16:43:00, Sibylle Koczian wrote:
>> hopefully the subject line isn't too misleading. This is my problem: I 
>> would like to connect the "clicked" signal of several buttons to one 
>> and the same function - but this function should know which button sent 
>> the signal. Example: one button to increase a value, another to 
>> decrease it, and one single function which adds '+1' or '-1' depending 
>> on the sending button. Or a row of buttons with a letter, and clicking 
>> one searches for all words beginning with this letter in a list.
>>
>> How can I do this? Subclassing QPushButton seems to be a possibility, 
>> but is there a simpler way?
>
> The unclean solution would be to use the sender() function, the proper 
> one is to have a look at QSignalMapper.

An alternative pythonic way to do this is to do something like:

class BoundCaller(object):
     """A callable class to wrap a function and its arguments."""
     def __init__(self, fn, *params):
         self.fn = fn
         self.params = params
     def __call__(self, *params):
         self.fn( *(self.params+params) )

in your class:

      def __init__(self):
          self.myslot1 = BoundCaller(myslot, 1)
          self.myslot2 = BoundCaller(myslot, 2)

          self.connect(self.mybutton, SIGNAL('clicked()'), self.myslot1)
          ...

      def myslot(self, boundarg):
          print boundarg

You have to keep a separate reference to the BoundCaller object (hence the
assignment to self), otherwise it gets garbage collected.

Jeremy

-- 
Jeremy Sanders <jeremy at jeremysanders.net>
http://www.jeremysanders.net/                Cambridge, UK
Public Key Server PGP Key ID: E1AAE053




More information about the PyQt mailing list