[PyQt] Problems with new-style signal/slot syntax

Phil Thompson phil at riverbankcomputing.com
Tue Apr 9 22:19:35 BST 2013


On Tue, 09 Apr 2013 21:06:44 +0100, Baz Walter <bazwal at ftml.net> wrote:
> When doing new-style connections, I normally use a Python type object as

> the selector (if necessary), and only very occasionally use a string. 
> However, I was surprised to discover that this does not always work as 
> expected. For example:
> 
>      from PyQt4 import QtGui, QtCore
>      app = QtGui.QApplication([])
>      c = gui.QComboBox()
>      c.activated['QString']
> 
> works okay, but:
> 
>      m = QtGui.QMenu()
>      m.triggered['QAction']
> 
> gives this error:
> 
>      KeyError: 'there is no matching overloaded signal'
> 
> After a bit of trial and error, it seems that signatures with "plain" or

> "const" arguments work okay, but the ones with "pointer" arguments 
> don't. That is, unless the full C++ signature is used, in which case it 
> always works:
> 
>      m.triggered['QAction *']
>      <bound signal triggered of QMenu object at 0x2512b00>
> 
>      c.activated['const QString &']
>      <bound signal activated of QComboBox object at 0x18308c0>
> 
> (Is it intended that these latter two variants work? It doesn't seem to 
> be documented anywhere).

Qt treats const QString& and plain QString as equivalent as far as signal
arguments are concerned. However QAction* is different to QAction. A
QObject derived instance will only ever be passed as a pointer, but that's
not true for other types. Therefore, for consistency, I think it would be
wrong to strip the "*". I agree the documentation could be clarified.

Phil


More information about the PyQt mailing list