PythonQt
PythonQT完美将Python与QT结合,项目:https://github.com/MeVisLab/pythonqt(文档https://mevislab.github.io/pythonqt/)
1、脚本放入资源文件的使用方法:(参考PythonQt自带的例子CPPPyWrapperExample)
可将脚本放入资源文件中,如:/datarequest.py
A、mainModule.evalFile(":datarequest.py");
PythonQtObjectPtr tag = mainModule.evalScript("EyeD3Tagger()\n", Py_eval_input);
B、PythonQt::self()->setImporter(NULL); //这一句很重要
PythonQt::self()->getMainModule().evalScript("import sys");
PythonQt::self()->getMainModule().evalScript("sys.path.append(':')"); //这一句很重要
mainModule.evalScript("import datarequest\n");
PythonQtObjectPtr tag = mainModule.evalScript("datarequest.DataRequest()\n", Py_eval_input);
在PythonQt中evalScript函数不支持Unicode:
1 QVariant PythonQt::evalScript(PyObject* object, const QString& script, int start) 2 { 3 QVariant result; 4 PythonQtObjectPtr p; 5 PyObject* dict = NULL; 6 clearError(); 7 if (PyModule_Check(object)) { 8 dict = PyModule_GetDict(object); 9 } else if (PyDict_Check(object)) { 10 dict = object; 11 } 12 if (dict) { 13 p.setNewRef(PyRun_String(script.toLatin1().data(), start, dict, dict));
//p.setNewRef(PyRun_String(script.toUtf8().data(), start, dict, dict)); 14 } 15 if (p) { 16 result = PythonQtConv::PyObjToQVariant(p); 17 } else { 18 handleError(); 19 } 20 return result; 21 }
这是由于函数中第13行将脚本代码(script)传入Python时使用的是 toLation1 函数,这个函数是不支持百拉丁字符的,因此将这个函数替换成 toUtf8即可