[C++-sig] Can boost.python and PyQt be used together?
David Abrahams
dave at boost-consulting.com
Sat Dec 7 22:13:52 CET 2002
"Paul F. Kunz" <Paul_Kunz at SLAC.Stanford.EDU> writes:
>>>>>> 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()
Oh, I see that there's no interaction on the C++ side.
In that case, I agree with you. There's no reason Boost.Python and SIP
should have to interact in any way.
>
>> 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 assumed that because you cited a problem, there must be one, and the
only kind of issue I can imagine arises when the C++ code wrapped with
SIP needs to use a type which you've wrapped with Boost.Python, or
vice-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.
I don't know, but this certainly appears to be a SIP problem. I don't
think this has anything to do with Boost.Python.
--
David Abrahams
dave at boost-consulting.com * http://www.boost-consulting.com
Boost support, enhancements, training, and commercial distribution
More information about the Cplusplus-sig
mailing list