[PyKDE] So how do I pass an argument to a function tied to a callback?

Boudewijn Rempt boud at rempt.xs4all.nl
Sat Mar 3 11:48:32 GMT 2001

On Fri, 2 Mar 2001, Ken Kozman wrote:
>    Or a little more succinctly, as Aaron said, you want but can't do the
> following:
>     self.connect( widget, SIGNAL( "clicked()" ), self.someFunction( num ) )
I may not be getting the issue, but I vaguely remember wanting somehting
like this, too, a while ago. My solution was a bit different, though.
If I under stand this right right, there are two objects, 'self' and
'widget', where 'widget' is owned by 'self', and 'num' is a value known
in 'self'. If you want to connect the pressing of a button (which doesn't
know anything about 'num') to the activation of a function that acts
upon 'num'. In fact, keeping track of num is the 'self''s business. To take
the script Aaron posted earlier, I'd make 'num' a property of the Lambda 

class Lambda(QMainWindow):

    def __init__(self):
        self.num = 1

After that, it's a matter of deciding how you want it to be used. You could
use it directly in changeTopStruct, or have an intermediate slot that emits
a new signal that transports the value (useful if the change of the self.num
is interesting to other classes, too):

        self.connect( self.top_struct_button, SIGNAL( "clicked()" ),
        self.connect( self, PYSIGNAL("sigClicked"), self.changeTopStruct)     
        return # note - you don't need this return at all

    def clicked(self):
      self.emit(PYSIGNAL("sigClicked"), (self.num,))
    def changeTopStruct(self, num):
        Pops up an input dialog to prompt user for new top structure name.

Of course, since it is possible to emit PYSIGNAL's directly from a connect 
statement, it would be ideal if we could add a value to that too, just as
it is possible to emit a signal with values as in the clicked method above:

        self.connect( self.top_struct_button, SIGNAL( "clicked()" )
                                            , PYSIGNAL("sigClicked")
                                            , (self.num,)
But that doesn't work :-(.


Boudewijn Rempt | http://www.valdyas.org

More information about the PyQt mailing list