[PyKDE] Is QObject.sender() working ?

Greg Green gregory.p.green at boeing.com
Fri May 18 23:59:54 BST 2001

Looking at the Qt documentation:

Returns a pointer to the object that sent the signal, if called in a
slot before any function call or signal emission. Returns an
undefined value in all
other cases.

Warning: This function will return something apparently correct in
other cases as well. However, its value may change during any
function call,
depending on what signal-slot connections are activated during that
call. In Qt 3.0 the value will change more often than in 2.x.

Warning: This function violates the object-oriented principle of
modularity, However, getting access to the sender might be practical
when many
signals are connected to a single slot. The sender is undefined if
the slot is called as a normal C++ function.

I suspect the last sentence is the problem. Looking at the PyQt code
shows the sender function getting called after some other things. I
would just hook each button up to a separate slot, ugly, but it will

> Sorry if this as already been reported.
> Look at this little code :
> class MyWidget(qt.QWidget):
>     def __init__ (self, *args):
>         apply (qt.QWidget.__init__, (self,)+args)
>         self.vbox = qt.QVBoxLayout(self)
>         # Create two buttons
>         self.bt1 = qt.QPushButton("Button 1", self) ;
>         self.bt2 = qt.QPushButton("Button 2", self) ;
>         # Print button references
>         print "Button 1:", self.bt1
>         print "Button 2:", self.bt2
>         # Add them in the layout
>         self.vbox.addWidget(self.bt1)
>         self.vbox.addWidget(self.bt2)
>         # Connect both buttons to the same slot
>         self.connect(self.bt1, qt.SIGNAL("clicked()"), self.Clicked)
>         self.connect(self.bt2, qt.SIGNAL("clicked()"), self.Clicked)
>     def Clicked(self):
> 	obj = self.sender()
>         print "-- Button clicked:", self.sender()
> And here's a sample output, where I clicked both buttons :
> [yves at kafka ConfiMake]$ ./test.py
> Button 1: <qt.QPushButton instance at 0x82eb92c>
> Button 2: <qt.QPushButton instance at 0x82efbcc>
> -- Button clicked: None
> -- Button clicked: None
> So : the QObject.sender() function seems to return always "None".


Greg Green
Advanced Design Systems
Math & Computing Technology
(425) 865-2790

More information about the PyQt mailing list