[PySide] Obtaining QObject from PySide based PyObject (complete)

David García Garzón david.garcia at upf.edu
Wed Aug 29 23:48:45 CEST 2012


On 28/08/12 16:25, Hugo Parente Lima wrote:
> On Tuesday, August 28, 2012 02:48:32 PM David García Garzón wrote:
>> On Monday 27 August 2012 16:23:03 Hugo Parente Lima wrote:
>>> On Monday, August 27, 2012 09:12:27 PM David García Garzón wrote:
>>>> Sorry for the previous unfinished message. Here goes the final one.
>>>>
>>>> I am porting a CPython library (boost based indeed) from PyQt to PySide.
>>>> I had a function in the library that received a Sip wrapped widget
>>>> as a PyObject and I used the very ugly SIP api to recover a pointer to
>>>> the
>>>> actual C++ QObject.
>>>>
>>>> Does anyone know how recover the C++ QObject from the PyObject in
>>>> PySide?
>>> You can use:
>>> Shiboken::Object::cppPointer(...), it's on libshiboken basewrapper.h
>>>
>>> It receives two parameters, a SbkObject* and a PyTypeObject*, the
>>> SbkObject* will be your PyObject*, just cast it and make sure it always
>>> will be a Python object representing a C++ object bound using Shiboken,
>>> the
>>> PyTypeObject* must be the PyTypeObject* for QObject, you can get it using:
>>>
>>> Shiboken::TypeResolver::get("QObject*")->pythonType();
>>>
>>> TypeResolver class is located on libshiboken typeresolver.h header.
>>>
>>> Hope this would help you.
>> Yes, thanks, this seems to be just what i needed. You even provided answer
>> to what i wanted to ask next, how to identify pyside objects. No time to
>> try it just now but i am eager to try it to see if it works. Thanks a lot.
> There's a function on basewrapper.h that do just that, test if the PyObject is
> a SbkObject, i.e. a PySide object.
>
> Shiboken::Object::checkType(PyObject*)
>
> Returns true if the object is an instance of a type created by the Shiboken
> generator.
>
>> David

Thats the final code:

void * shibokenUnwrap(PyObject * pyobject)
{
:...if (not Shiboken::Object::checkType(pyobject))
:...:...return 0; // Not a shiboken object
:...SbkObject * sbkobject = (SbkObject *) pyobject;

:...PyTypeObject * type = 
Shiboken::TypeResolver::get("QObject*")->pythonType();
:...void * cppobject = Shiboken::Object::cppPointer(sbkobject, type);
:...if (not cppobject)
:...:...return 0; // Not a QObject
:...return cppobject;
}

I got it compiling, but to get it working i still need do the opposite 
way. Converting a new c++ qobject created in c++ into a pyside pyobject.

I found in the headers the promising function 
Shiboken::Object::newObject but i don't know what i should send as first 
parameters. Any ideas?.

David.







More information about the PySide mailing list