<HTML ><HEAD ><TITLE >Signal and Slot Support</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" TITLE="Python Bindings for KDE (PyKDE-3.16.0)" HREF="index.html"><LINK REL="PREVIOUS" TITLE="General Limitations" HREF="limits.html"><LINK REL="NEXT" TITLE="Static Member Functions" HREF="static.html"></HEAD ><BODY CLASS="SECT1" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Python Bindings for KDE (PyKDE-3.16.0)</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="limits.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="static.html" ACCESSKEY="N" >Next</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="AEN81" ></A >Signal and Slot Support</H1 ><DIV CLASS="SECT2" ><H2 CLASS="SECT2" ><A NAME="AEN83" ></A >General Signals and Slots</H2 ><P >A signal may be either a Qt signal (specified using <TT CLASS="LITERAL" >SIGNAL()</TT >) or a Python signal (specified using <TT CLASS="LITERAL" >PYSIGNAL()</TT >).</P ><P >A slot can be either a Python callable object, a Qt signal (specified using <TT CLASS="LITERAL" >SIGNAL()</TT >), a Python signal (specified using <TT CLASS="LITERAL" >PYSIGNAL()</TT >), or a Qt slot (specified using <TT CLASS="LITERAL" >SLOT()</TT >).</P ><P >You connect signals to slots (and other signals) as you would from C++. For example:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >QObject.connect(a,SIGNAL("QtSig()"),pyFunction) QObject.connect(a,SIGNAL("QtSig()"),pyClass.pyMethod) QObject.connect(a,SIGNAL("QtSig()"),PYSIGNAL("PySig")) QObject.connect(a,SIGNAL("QtSig()"),SLOT("QtSlot()")) QObject.connect(a,PYSIGNAL("PySig"),pyFunction) QObject.connect(a,PYSIGNAL("PySig"),pyClass.pyMethod) QObject.connect(a,PYSIGNAL("PySig"),SIGNAL("QtSig()")) QObject.connect(a,PYSIGNAL("PySig"),SLOT("QtSlot()"))</PRE ></TD ></TR ></TABLE ><P >When a slot is a Python method that corresponds to a Qt slot then a signal can be connected to either the Python method or the Qt slot. The following connections achieve the same effect.</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >sbar = QScrollBar() lcd = QLCDNumber() QObject.connect(sbar,SIGNAL("valueChanged(int)"),lcd.display) QObject.connect(sbar,SIGNAL("valueChanged(int)"),lcd,SLOT("display(int)"))</PRE ></TD ></TR ></TABLE ><P >The difference is that the second connection is made at the C++ level and is more efficient.</P ><P >Disconnecting signals works in exactly the same way.</P ><P >Any instance of a class that is derived from the <TT CLASS="LITERAL" >QObject</TT > class can emit a signal using the <TT CLASS="LITERAL" >emit</TT > method. This takes two arguments. The first is the Python or Qt signal, the second is a Python tuple which are the arguments to the signal. For example:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >a.emit(SIGNAL("clicked()"),()) a.emit(PYSIGNAL("pySig"),("Hello","World"))</PRE ></TD ></TR ></TABLE ><P >Qt allows a signal to be connected to a slot that requires fewer arguments than the signal passes. The extra arguments are quietly discarded. Python slots can be used in the same way.</P ></DIV ><DIV CLASS="SECT2" ><H2 CLASS="SECT2" ><A NAME="AEN103" ></A >Slots in Menus, Toolbars and Actions</H2 ><P >The C++ declarations for menu items or KActions are similar to these examples:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >int QMenuData::insertItem (const QString & text, const QObject * receiver, const char * member, int accel = 0, int id = -1, int index = -1 ) KAction ( const QString& text, int accel, const QObject* receiver, const char* slot, QObject* parent, const char* name = 0 )</PRE ></TD ></TR ></TABLE ><P >Notice the "const QObject* receiver, const char* slot" parameters for each declaration.</P ><P >In PyKDE, these two parameters are replaced with a SINGLE parameter that specifies the slot to be connected to the menu item, toolbar button or KAction:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >p = insertItem ("Open", self.slotOpen, 0, -1, -1) action = KAction ("Open", 0, self.slotOpen, None, 0)</PRE ></TD ></TR ></TABLE ><P >This substitution applies to appropriate methods in KStdAction, KAction and related subclasses, KAccelMenu and KToolBar</P ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="limits.html" ACCESSKEY="P" >Prev</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="static.html" ACCESSKEY="N" >Next</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >General Limitations</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Static Member Functions</TD ></TR ></TABLE ></DIV ></BODY ></HTML >