[PyQt] Problem with custom class derived from QObject as signal parameter

Johan Fläckman flackman.johan at gmail.com
Tue Jul 14 12:01:17 BST 2015


Hi, I have a C++ class that emits a pointer to a class deriving from
QObject. The instance ends up in python slots as a QObject (and not to the
class deriving from it). Can someone help me figure out what I have done
wrong?

Python 2.7, 64bit
Windows 7

Qt 5.4.1
PyQt 5.4.1
SIP 4.16.7


I tried to make a minimal repro case;


*C++*
class Foo : public QObject
{
    Q_OBJECT
public:
    explicit Foo(QObject* parent = 0) : QObject(parent) { }
    ~Foo() {};
};

class Emitter : public QObject
{
    Q_OBJECT
public:
    Emitter() {}
    ~Emitter() {}
    void AddItem() { emit itemAdded( new Foo ); }

Q_SIGNALS:
    void itemAdded(Foo*);
};

*SIP*
%Module(name=pyqt_test, call_super_init=True)

%ModuleCode
#include <test.h>
%End

%Import QtCore/QtCoremod.sip

class Foo : public QObject
{
%TypeHeaderCode
#include <test.h>
%End
public:
    explicit Foo(QObject *parent /TransferThis/ = 0);
    ~Foo();
};

class Emitter : public QObject
{
%TypeHeaderCode
#include <test.h>
%End
public:
    Emitter();
    virtual ~Emitter();
    void AddItem();

Q_SIGNALS:
    void itemAdded(Foo*);
};


*Python*

from pyqt_test import Foo, Emitter

from PyQt5.QtCore import pyqtSlot


@pyqtSlot(Foo)

def pyslot(inst):

    print inst


em = Emitter()

em.itemAdded.connect(pyslot)

em.AddItem()

*Py output*

<PyQt5.QtCore.QObject object at 0x000000000542B558>



If I modify the example and use, for example, QFileSelector, instead of the
Foo class then it gets passed along as a QFileSelector to the python slot.
Leading me to believe I am missing some kind of directive or annotation in
my sip files.


Any ideas?


Cheers,

Johan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20150714/6b63bc5e/attachment.html>


More information about the PyQt mailing list