|
|
|
<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 TQt 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 TQt signal (specified using
|
|
|
|
<TT
|
|
|
|
CLASS="LITERAL"
|
|
|
|
>SIGNAL()</TT
|
|
|
|
>), a Python signal (specified using
|
|
|
|
<TT
|
|
|
|
CLASS="LITERAL"
|
|
|
|
>PYSIGNAL()</TT
|
|
|
|
>), or a TQt 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"
|
|
|
|
>TQObject.connect(a,SIGNAL("TQtSig()"),pyFunction)
|
|
|
|
TQObject.connect(a,SIGNAL("TQtSig()"),pyClass.pyMethod)
|
|
|
|
TQObject.connect(a,SIGNAL("TQtSig()"),PYSIGNAL("PySig"))
|
|
|
|
TQObject.connect(a,SIGNAL("TQtSig()"),SLOT("TQtSlot()"))
|
|
|
|
TQObject.connect(a,PYSIGNAL("PySig"),pyFunction)
|
|
|
|
TQObject.connect(a,PYSIGNAL("PySig"),pyClass.pyMethod)
|
|
|
|
TQObject.connect(a,PYSIGNAL("PySig"),SIGNAL("TQtSig()"))
|
|
|
|
TQObject.connect(a,PYSIGNAL("PySig"),SLOT("TQtSlot()"))</PRE
|
|
|
|
></TD
|
|
|
|
></TR
|
|
|
|
></TABLE
|
|
|
|
><P
|
|
|
|
>When a slot is a Python method that corresponds to a TQt slot then a signal can
|
|
|
|
be connected to either the Python method or the TQt slot. The following
|
|
|
|
connections achieve the same effect.</P
|
|
|
|
><TABLE
|
|
|
|
BORDER="0"
|
|
|
|
BGCOLOR="#E0E0E0"
|
|
|
|
WIDTH="100%"
|
|
|
|
><TR
|
|
|
|
><TD
|
|
|
|
><PRE
|
|
|
|
CLASS="PROGRAMLISTING"
|
|
|
|
>sbar = TQScrollBar()
|
|
|
|
lcd = TQLCDNumber()
|
|
|
|
|
|
|
|
TQObject.connect(sbar,SIGNAL("valueChanged(int)"),lcd.display)
|
|
|
|
TQObject.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"
|
|
|
|
>TQObject</TT
|
|
|
|
>
|
|
|
|
class can emit a signal using the <TT
|
|
|
|
CLASS="LITERAL"
|
|
|
|
>emit</TT
|
|
|
|
> method. This takes
|
|
|
|
two arguments. The first is the Python or TQt 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
|
|
|
|
>TQt allows a signal to be connected to a slot that retquires fewer arguments than
|
|
|
|
the signal passes. The extra arguments are tquietly 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 TQMenuData::insertItem (const TQString & text,
|
|
|
|
const TQObject * receiver, const char * member,
|
|
|
|
int accel = 0, int id = -1, int index = -1 )
|
|
|
|
|
|
|
|
KAction ( const TQString& text, int accel,
|
|
|
|
const TQObject* receiver, const char* slot,
|
|
|
|
TQObject* parent, const char* name = 0 )</PRE
|
|
|
|
></TD
|
|
|
|
></TR
|
|
|
|
></TABLE
|
|
|
|
><P
|
|
|
|
>Notice the "const TQObject* 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
|
|
|
|
>
|