[PyKDE] Re: "sender" info in Python slot

Sibylle Koczian Sibylle.Koczian at T-Online.de
Sat Nov 11 09:35:00 GMT 2006


Hello,

I'm choosing this post to answer, because it contains the other possibilities.

Jeremy Sanders wrote:
> 
> 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.
> 

Why unclean (I didn't look yet at the sender() function)? Still trying to get a simple QSignalMapper example to run. In the PyQt4 examples it is used only in mdi.py which isn't exactly simple, right?

> 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.
> 

I tried this, it works, and I think I've understood it.

Thanks for all the answers!

-- 
Dr. Sibylle Koczian 
Fasanenstrasse 12 
D-82293 Mittelstetten 




More information about the PyQt mailing list