[PyQt] SIP PyQT compilation issue

Phil Thompson phil at riverbankcomputing.com
Fri Apr 1 09:37:49 BST 2011


On Thu, 31 Mar 2011 15:24:30 -0700, emmanuel_mayssat at lynceantech.com
wrote:
> On 09:20 Thu 31 Mar     , Phil Thompson wrote:
>> You can lie to SIP as much as you want. For example if B is derived
from
>> A
>> in C++ you can tell SIP that it doesn't derive from anything and you
>> won't
>> get access to any of A's methods from Python. You could even say that B
>> contained some of A's methods. The main problem area is virtuals (if
you
>> want to expose them) which really have to be in the right class
>> (including
>> all their reimplementations).
> 
> I understand. This means:
> 1/ I can remove superclass from a class definition
> In which case, I can add methods to a class wich are actually in the
> superclass
> 2/ I can create custom methods which are not in the original C++ library
> But of course the motivation should be to stay as close as possible to
the
> C++ declaration.
> (Given that this is core concept, it may be useful to have a test case
in
> the doc!)
> So I get it, with SIP we can lie through your teeth.
> 
> But as my wife once told me, I am not a very good liair.
> And that's confirmed by SIP...
> 
> $ grep UserMessage * 
> CaFramework.sip://sip %Include UserMessage.sip
> QCaObject.sip://sip      QCaObject( const QString& recordName, QObject
> *eventObject, UserMessage* userMessageIn );
> QCaObject.sip://sip      void setUserMessage( UserMessage* userMessageIn
);
> QCaObject.sip://sip      void initialise( const QString& newRecordName,
> QObject *newEventHandler, UserMessage* userMessageIn );
> QCaWidget.sip://sip    UserMessage userMessage;        
> 
> but
> 
> g++ -c -pipe -fPIC -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 
> -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wall -W
> -D_REENTRANT -DNDEBUG -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_GUI_LIB -I.
>
-I/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//widgets/include
>
-I/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include
>
-I/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//api/include
>
-I/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//plugins/include
> -I/usr/include/QtCore
> -I/usr/include/QtGui -I/usr/include/python2.6
> -I/usr/lib64/qt4/mkspecs/default -I/usr/include -I/usr/X11R6/include -o
> sipCaFrameworkQCaWidget.o sipCaFrameworkQCaWidget.cpp
> In file included from
>
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/QCaObject.h:46,
>                  from
>                 
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/QCaWidget.h:36,
>                  from QCaWidget.sip:4:
> /usr/include/QtCore/qobject.h: In copy constructor
> 'UserMessage::UserMessage(const UserMessage&)':
> /usr/include/QtCore/qobject.h:309: error: 'QObject::QObject(const
> QObject&)' is private
>
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/UserMessage.h:38:
> error: within this context
> In file included from QCaWidget.sip:4:
>
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/QCaWidget.h:
> In copy constructor 'QCaWidget::QCaWidget(const QCaWidget&)':
>
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/QCaWidget.h:43:
> note: synthesized method 'UserMessage::UserMessage(const UserMessage&)'
> first required here 
> sipCaFrameworkQCaWidget.cpp: In constructor
> 'sipQCaWidget::sipQCaWidget(const QCaWidget&)':
> sipCaFrameworkQCaWidget.cpp:59: note: synthesized method
> 'QCaWidget::QCaWidget(const QCaWidget&)' first required here 
> sipCaFrameworkQCaWidget.cpp: In function 'void*
> init_QCaWidget(sipSimpleWrapper*, PyObject*, PyObject*, PyObject**,
> PyObject**, PyObject**)':
> sipCaFrameworkQCaWidget.cpp:281: error: cannot allocate an object of
> abstract type 'sipQCaWidget'
> sipCaFrameworkQCaWidget.cpp:22: note:   because the following virtual
> functions are pure within 'sipQCaWidget':
>
/home/cls1fs/epics/epics2//workspace/epicsqt/epicsqt-1.1.1-src//ca_framework//data/include/QCaWidget.h:60:
> note:    virtual qcaobject::QCaObject* QCaWidget::createQcaItem(unsigned
> int)
> sipCaFrameworkQCaWidget.cpp:296: error: cannot allocate an object of
> abstract type 'sipQCaWidget'
> sipCaFrameworkQCaWidget.cpp:22: note:   since type 'sipQCaWidget' has
pure
> virtual functions
> make: *** [sipCaFrameworkQCaWidget.o] Error 1
> make: Leaving directory
>
`/home/cls1fs/epics/epics2/workspace/epicsqt/epicsqt-1.1.1-src/ca_framework/sip/sipcode'
> 
> Well, it seems I have several different errors...

Ok course if you are going to lie you have to do it consistently.

I assume that in C++ UserMessage is a sub-class of QObject, but you have
lied to SIP about this. If so, then you need to tell SIP that UserMessage
has a private copy ctor (which it normally infers from the QObject
definition).

Phil


More information about the PyQt mailing list