[PyKDE] Re: "sender" info in Python slot
Sibylle.Koczian at T-Online.de
Sat Nov 11 09:35:00 GMT 2006
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
More information about the PyQt