On Thu, 31 Mar 2011 15:24:30 -0700, emmanuel_mays...@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 _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt