开发环境:Qt5.9.9(MSVC64_bit)+Python3.6.0(64bit) (建议在创建项目的时候选择MSVC64_bit配合Python的64位,避免不必要的错误!)
一、将Python集成到Qt中
1.安装Python环境
2.配置 python 解释器
工具->选项->环境->外部工具
添加->添加目录 (双击可任意更改名称这里更改为RunPy)->添加工具(双击可任意更改名称这里更改为Python3)
点击Python3,配置执行档、参数等配置
执行档:python的安装目录,我这里是(E:\Python36\python.exe),你自己找到自己安装的python.exe目录
参数:%{CurrentDocument:FilePath}
工作目录:%{CurrentDocument:Path}
二、在Qt中创建一个Python脚本测试
在新建的Python脚本中编写代码(matplotlib等其他Python库需要去cmd命令行 pip install xxx 安装一下)
点击 工具->外部->RunPy->Python3,运行脚本
运行结果:
三、Qt调用Python脚本
1.在.pro文件中将python的include和lib包含进来
INCLUDEPATH += -I E:\Python36\include
LIBS += -LE:\Python36\libs -lpython36
四、小案例
至此写一个小案例来测试一下:
在main方法中编写代码:
#include "mainwindow.h"
#include <QApplication>
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Py_Initialize(); //初始化python模块
if ( !Py_IsInitialized() )//查看是否成功初始化
{
return -1;
}
PyRun_SimpleString("import sys"); //PyRun_SimpleString:简单执行python命令的函数
PyRun_SimpleString("sys.argv = ['python.py']");
PyRun_SimpleString("sys.path.append('./')");// 添加目录地址
//导入scriptSecond.py模块
PyObject* pModule = PyImport_ImportModule("scriptSecond");//调用scriptSecond.py
if (!pModule) //判断.py文件是否能调用
{
printf("Cant open python file!\n");
return -1;
}
//获取scriptSecond模块中的temperImg函数
PyObject* pFunhello= PyObject_GetAttrString(pModule,"temperImg");//scriptSecond.py中的temperImg函数
//注释掉的这部分是另一种获得scriptSecond模块中的temperImg函数的方法
// PyObject* pDict = PyModule_GetDict(pModule);
// if (!pDict) {
// printf("Cant find dictionary.\n");
// return -1;
// }
// PyObject* pFunhello = PyDict_GetItemString(pDict, "temperImg");
if(!pFunhello){
cout<<"Get function hello failed"<<endl;
return -1;
}
//调用temperImg函数
PyObject_CallFunction(pFunhello,NULL);
//结束,释放python
Py_Finalize();
return a.exec();
}
编写scriptSecond.py代码:
import matplotlib.pyplot as plt
def temperImg():
plt.plot([1,2,1,2])
plt.show()
temperImg()
点击运行,运行你会发现,运行结果是Cant open python file!
这里要特别要注意,此时你需要将你要调用的Python脚本复制到你建立的工程目录的debug文件目录下。
之后点击绿色的运行按钮:
运行成功!
然而在调试的过程中并非如此之顺利,现在我将我在运行过程中遇到的其他问题以及我在网上找到的可行方法在此总结一下:
1、打不开python.h文件
先确定python的include和libs是否在.pro文件包含正确。确认正确之后,点击构建文件->构建所有文件。
2、在创建.py文件命名为test.py,会和python定义的test.py重复,运行会报错找不到.py文件。所以不要将.py文件命名为test.py。
3、👎 error: LNK1104: 无法打开文件“python36_d.lib”
在Python36的include文件夹下找到pyconfig.h文件,将python36_d.lib更改为python36.lib
4、numpy版本过高导致环境错误,建议使用numpy1.16.0
pip install numpy==1.16.0
pip install --user numpy==1.16.0
5、将.py文件中的函数名命名为fun(),会报错。不建议将python脚本的函数命名为fun()
6、当程序你已经吧Python脚本放置到Debug文件下并且一切准备工作都没有问题的情况下。qDebug显示 pModule is null,这很有可能是因为你的Python文件有语法等错误,建议检查一下Python脚本写的代码。