[C++-sig] Can boost.python and PyQt be used together?
Paul F. Kunz
Paul_Kunz at SLAC.Stanford.EDU
Sat Dec 7 21:22:11 CET 2002
>>>>> On Sat, 07 Dec 2002 15:02:53 -0500, David Abrahams <dave at boost-consulting.com> said:
> "Paul F. Kunz" <Paul_Kunz at SLAC.Stanford.EDU> writes:
>> I have some widgets which inherit from Qt and made them as Python
>> extension module using boost.python (v2).
> So, in Python they're represented as Boost.Python extension
> instances containing instances of your widget classes (?)
Yes. My C++ objects are wrap by Boost.Python
>> Now another group wants to use them in their application built with
>> PyQt which uses SIP to make the Python extension modules. At first
>> glance, it looks like this wouldn't work.
> If I understand you correctly, whether it would work or not depends
> on how sophisticated SIP can be about unwrapping a Boost.Python
> extension instance and retrieving the underlying C++ object. I doubt
> SIP has this ability built-in, but it may be possible for you to add
> it.
I don't see why SIP needs to know my objects are wrapped by
Boost.Python. But let me show you some Python code
a = QApplication(sys.argv)
clock = DigitalClock()
clock.resize(170,80)
a.setMainWidget(clock)
clock.show()
# the above are Python objects wrapped with SIP
# below are my objects wrapped with Boost.Pythoin
wc = WindowController()
cw = wc.newCanvas()
a.exec_loop()
> 1. Get Boost.Python to wrap your objects in a way that SIP already
> undertstands
> 2. Get SIP to understand the way Boost.Python already wraps objects
Why should SIP need to know about my objects or vica versa?
I've trace the point of a problem a bit further. Steping down the
call stack, I see...
#6 0x0807705e in eval_frame (f=0x811a974) at Python/ceval.c:1784
(gdb)
#5 0x08056794 in PyObject_GetAttr (v=0x82cc4cc, name=0x815a8e0)
at Objects/object.c:1108
(gdb)
#4 0x401afa43 in instanceGetAttr ()
from /usr/local/lib/python2.2/site-packages/libsip.so
Note the function is in libsip.so. The line in PyObject_GetAttr()
that got us there appears to be...
if (tp->tp_getattro != NULL)
return (*tp->tp_getattro)(v, name);
Perhaps SIP depends on overriding something in Python in order to
interact with it's extension modules.
More information about the Cplusplus-sig
mailing list