原文地址:http://blog.csdn.net/jingwenlai_scut/article/details/5325448python
简介:shell
PythonQt是从商业软件中的MEVISLIB中剥离出来的脚本引擎部分,其能够方便地将Python嵌入到CPP工程中。数组
以前对python嵌入方式作过一番搜索,发现pythonQt应该算是一个比较好的方法,可使本身更专一到本身应用的开发中。app
下载: 能够从pythonqt.sourceforge.net中下载[http://sourceforge.net/p/pythonqt/wiki/Home/]测试
编译:按照其文档对其进行编译,须要注意的是,在不一样的平台上须要修改相对应的python.prf中的python版本,另外,对于Mac而言, 还须要特别注意一下其版本的路径,这一点我一开始在本身的ibook上没有留意,后来发现编译到一半的时候提示出错,细查之下才留意到,系统中安装的 python版本是2.3,本身安装及配置的版本是2.6,而在python.prf中配置的默认路径指向的是2.3中的路径,修改为2.6相应的路径后 再编译便可经过。ui
测试:在编译的时候会生成示例的可执行文件,可是多是路径方面的缘由,未能运行。想一想后面集成进工程中仍是须要写配置文件,所以,本身写了一个cmake文件,测试的同时也便于之后本身参考:spa
project(PythonQtTest) cmake_minimum_required(VERSION 2.6) find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) find_package(PythonLibs REQUIRED) if(PYTHONLIBS_FOUND) include_directories(${PYTHON_INCLUDE_PATH}) else(PYTHONLIBS_FOUND) message("could not find PythonLibs") endif(PYTHONLIBS_FOUND) # qt4_wrap_cpp(PyExampleObject_MOC PyExampleObject.h) qt4_add_resources(PyScriptingConsole_RCS_SOURCES PyScriptingConsole.qrc) #PythonQt related include_directories(/usr/local/include/PythonQt) link_directories(/usr/local/lib) set(APP_HEADERS PyExampleObject.h ) set(APP_SOURCES PyExampleObject.cpp main.cpp ${PyScriptingConsole_RCS_SOURCES} ) set(PYTHONQT_LIBRARIES PythonQt PythonQtGui) add_executable(test ${APP_SOURCES} ${APP_HEADERS} ${PyExampleObject_MOC}) target_link_libraries(test ${PYTHONQT_LIBRARIES} ${QT_LIBRARIES} ${PYTHON_LIBRARIES})
排错:
.net
用cmake编译成功后,可是运行时导入一些库并未成功,如 import numpy,可是一些经常使用的import sys则能够用。一开始觉得是PythonQt仅支持Python内置的modules,而不支持外部的modules,差点放弃使用,准备本身用 Python C/API来写一个简单地本身用了。 可是,本身在系统的python中则能够自行导入任意的modules,想一想有多是环境变量的缘由,而后打印出环境变量查看,并查看对应目录,发如今该 目录下的模块都可导入,并不是只能导入部分模块。code
所以,在PythonQt的ScriptConsole的例子中用print sys.path与系统的python比较,发现确实不一致。blog
经过搜索,修改环境变量的方法参考以下:http://blog.csdn.net/likelynn/archive/2007/09/28/1804665.aspx
在测试的时候先用第三种手动append环境变量的方法先测试,发现可行。在此处须要注意,把当前目录(‘ ’)也须要加进去,要否则会出些小错误。
经过这样排错以后,整个pythonQt的ScriptConsole例子则基本上与系统的python console相似了,后续要作的则是在要使用的时候将其集成到Qt application之中。
数据如何在主程序及Python之间进行交互?
嵌入Python console的最终目的是但愿在主程序及Python之间进行数据的传递与处理。
Python与主程序之间数据的传递包含两种状况,一种是主程序中将C++ 类中的数据传送给Python供处理,关于使用的例子能够参见pythonqt源代码中的PyCPPWrapExample,其中包含了两种封装CPP对 象的方式。一种是使用decorators的方式来封装,一种是使用wrap factory的方式来封装。 另外一种状况是将Python中处理过的数据回传给C++程序做进一步处理,在pythonqt中是经过PythonQtObjPtr中的 getVariable等经过QVariant来获得python回传给Qt,而后经过类型转换获得。 如今还有一点没有尝试的是,如何回传多个值或一个数组,以前记得在numpy中看到过这部分的资料,有须要的时候再查一下了。