[PyKDE] callback not being called
David Boddie
david at boddie.org.uk
Sun Jan 21 18:36:48 GMT 2007
On Sunday 21 January 2007 09:05:40 -0800, Tony Cappellini wrote:
> I've trying to understand how to make a cmd button call a method when the
> button is pressed.
>
> I havne't been seen an example in the Signals & Slots section of the QT
> docs which describe how to connect a widget signal to a callback function,
> only how to call a widget slot function.
Do you mean that you want to call normal methods in Python classes and not
just those supplied by their Qt base classes?
> I don't get any runtime errors in my attempt to do this, but the callback
> function isn't being called.
>
> What is the preferred method of registering a non-widget slot to be called
> by a widget signal?
You should be able to use the same syntax as that used in the Qt
documentation, but there's also a PyQt-specific shortcut for slots that you
can use.
[Re-using your code]
class Dialog(QtGui.QDialog):
def __init__(self, parent=None):
QtGui.QDialog.__init__(self, parent)
self.patchBrowser = QtGui.QTextEdit()
# layout code omitted for brevity
def updateTextBox(self):
# this function should be called, when the button is pressed
self.patchBrowser.setPlainText(self.tr("Callback was called"))
def createPatchnameComboBox(self):
self.patchNames = QtGui.QComboBox()
self.patchNames.addItem("Entry 1")
self.patchNames.addItem("Entry 2")
# layout code omitted for brevity
# doesn't call updateTextBox
#self.connect(self.patchNames, QtCore.SIGNAL("higlighted"),
# self, QtCore.SLOT("updateTextBox") )
self.connect(self.patchNames, QtCore.SIGNAL("activated"),
self, QtCore.SLOT("updateTextBox") )
You need to pass the C++ signatures for signals and slots that are defined by
Qt, so you should SIGNAL("activated()") instead of SIGNAL("activated").
However, your updateTextBox() slot is just a normal Python method, so you can
just pass a reference to it:
self.connect(self.patchNames, QtCore.SIGNAL("activated()"),
self.updateTextBox)
For slots defined by the C++ base class, you can use SLOT() to specify them
in the connect() call; for example, the following connection would cause
the dialog to be hidden when a patchNames combobox entry is activated:
self.connect(self.patchNames, QtCore.SIGNAL("activated()"),
self, QtCore.SLOT("hide()"))
It's quite common that people forget to provide the full signature (with C++
types, but without argument names) to the SIGNAL() and SLOT() functions. It
would be interesting to know whether it seems like a strange convention to
people who have never used Qt with C++, or whether it catches everyone out
at some point.
David
More information about the PyQt
mailing list