On 10/01/2013 11:52 AM, Matt Newell wrote:
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();
}
Thanks I'll take a look later today.

Johnf
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to