Sophie

Sophie

distrib > Fedora > 13 > i386 > by-pkgid > 3a3caf2030fe9f56b649a0e16a9911a2 > files > 968

PyKDE-devel-3.16.6-3.fc13.i686.rpm

<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 &#38; text,
     const QObject * receiver, const char * member,
     int accel = 0, int id = -1, int index = -1 )

KAction ( const QString&#38; 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"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Static Member Functions</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>