PythonQt试用手记

原文地址:http://blog.csdn.net/jingwenlai_scut/article/details/5325448

简介:

PythonQt是从商业软件中的MEVISLIB中剥离出来的脚本引擎部分,其可以方便地将Python嵌入到CPP工程中。

之前对python嵌入方式做过一番搜索,发现pythonQt应该算是一个比较好的方法,可以使自己更专注到自己应用的开发中。

下载: 可以从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相应的路径后 再编译即可通过。

测试:在编译的时候会生成示例的可执行文件,但是可能是路径方面的原因,未能运行。想想后面集成进工程中还是需要写配置文件,因此,自己写了一个cmake文件,测试的同时也便于以后自己参考:

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})

排错:

用cmake编译成功后,但是运行时导入一些库并未成功,如 import numpy,但是一些常用的import sys则可以用。一开始以为是PythonQt仅支持Python内置的modules,而不支持外部的modules,差点放弃使用,准备自己用 Python C/API来写一个简单地自己用了。 但是,自己在系统的python中则可以自行导入任意的modules,想想有可能是环境变量的原因,然后打印出环境变量查看,并查看对应目录,发现在该 目录下的模块均可导入,并非只能导入部分模块。

因此,在PythonQt的ScriptConsole的例子中用print sys.path与系统的python比较,发现确实不一致。

通过搜索,修改环境变量的方法参考如下: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中看到过这部分的资料,有需要的时候再查一下了。


你可能感兴趣的:(PythonQt试用手记)