PDA

View Full Version : Problems with accessing embedded python objects in QT App



jriotto
6th December 2009, 00:50
I am trying to constuct a simple empbedded Python app. Basically it is a MainWindow with two
widgets in its central layout. The left widget is an openGL Viewer, and the right widget is a QTextEdit
whose text is sent to a python interpreter upon a button push.

My app is linked with a static c++ lib of graphic primatives, like constuct a cube and so on, which I've also
wrapped with SIP and have generated a GraphicPrimatives.pyd file.

When I run my app, I import the GraphicPrimatives.pyd file into my python interpreter
and create a graphics object (no problem), and I'd like to display the graphics object on the openGL side.

At first, I assumed that both the c++ side and the python side would point to the same library instantiation,
but that appears not to be the case. For instance, I created a singleton class in the graphics library. If I
call the singleton class from the C++ side, I see correct initialization, but if I then call the singleton class from
the python side, I get a 2nd initialization (i.e. they are not pointing back to the same static object in memory).

So my question is:
1) How do I fix the library problem above (i.e. how do I have both the c++ and python interpreter pointing to the same
library.

or

2) How do I pass or fetch a pointer to the object in python space? I've tried using something like
Py_Initialize();
PyRun_SimpleString("from GraphicPrimatives import *");
PyRun_SimpleString("rootObject = Object()");
PyObject* mainModule = PyImport_AddModule("__main__");
pyDict = PyModule_GetDict(mainModule);
PyObject* pyRootObject = PyDict_GetItemString(pyDict, "rootObject");

But simply trying to cast the pointer like:
(Object *)pyRootObject
produced incorrect results.

Any help would be greatly appreciated. Thanks - Jamie Riotto