> > That sounds encouraging. But it lacks a little detail - like how does > one embed python (PyQt) into a C++ app. The sip I sort of understand > and it is doable. I only need a few C++ classes and that makes sense. > But I don't have a clue how or where to start on embeding PyQt. Does > someone have an example or a link explaining the details. > > Johnf
The embedding is really not very involved. Here is a snippet of code from one of my apps, with some irrelevant stuff removed. This both initializes python, and loads CWD/plugins as a python module where you can load whatever you want from the __init__.py, including submodules. Matt // Return the named attribute object from the named module. // Returns a NEW reference(PyObject_GetAttrString) PyObject * getModuleAttr(const char *module, const char *attr) { #if PY_VERSION_HEX >= 0x02050000 PyObject *mod = PyImport_ImportModule(module); #else PyObject *mod = PyImport_ImportModule(const_cast<char *>(module)); #endif if (!mod) { PyErr_Print(); return 0; } #if PY_VERSION_HEX >= 0x02050000 PyObject *obj = PyObject_GetAttrString(mod, attr); #else PyObject *obj = PyObject_GetAttrString(mod, const_cast<char *>(attr)); #endif Py_DECREF(mod); if (!obj) { PyErr_Print(); return 0; } return obj; } void loadPythonPlugins() { Py_Initialize(); PyEval_InitThreads(); PyObject * sys_path = getModuleAttr("sys", "path"); if (!sys_path) { LOG_1( "Python Initialization Failure: Failed to get sys.path" ); return; } QString dir = QDir::currentPath(); // Convert the directory to a Python object with native separators. #if QT_VERSION >= 0x040200 dir = QDir::toNativeSeparators(dir); #else dir = QDir::convertSeparators(dir); #endif #if PY_MAJOR_VERSION >= 3 // This is a copy of qpycore_PyObject_FromQString(). PyObject *dobj = PyUnicode_FromUnicode(0, dir.length()); if (!dobj) { PyErr_Print(); return; } Py_UNICODE *pyu = PyUnicode_AS_UNICODE(dobj); for (int i = 0; i < dir.length(); ++i) *pyu++ = dir.at(i).unicode(); #else PyObject *dobj = PyString_FromString(dir.toAscii().constData()); if (!dobj) { PyErr_Print(); return; } #endif // Add the directory to sys.path. int rc = PyList_Append(sys_path, dobj); Py_DECREF(dobj); Py_DECREF(sys_path); if (rc < 0) { PyErr_Print(); return; } PyObject *plug_mod = PyImport_ImportModule("plugins"); if (!plug_mod) { PyErr_Print(); return; } Py_DECREF(plug_mod); PyEval_SaveThread(); } _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt