You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pytde/doc/signal.html

290 lines
5.3 KiB

<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
>