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.
290 lines
5.3 KiB
290 lines
5.3 KiB
13 years ago
|
<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
|
||
|
>
|