一、开发环境
Qt5.12.0
Python3.7.8 64bit
二、使用
新建一个Qt项目,右击项目名称,选择“添加库”
选择“外部库”,点击“下一步”
点击“浏览”,选择Python安装目录下的libs文件夹中的“python37.lib”文件,点击“下一步”
点击“完成”
.pro文件中出现如下代码,删除掉红框中37之后的“d”(此处删除d是因为在Python安装目录下的libs文件夹中只有python37.lib,没有python37d.lib)
再手动添加上第43和44行代码
右击项目,选择“构建”
构建完成后,在构建目录下创建一个py文件
在py文件中自定义一个简单的加法函数
def AddFunc(a, b):print("AddFunc: ")print("{} + {} = {}".format(a, b, a+b))return a + b
回到Qt中,更改main.cpp代码如下
#include "mainwindow.h"
#include <QApplication>
#include <Python.h>
#include <QDebug>int main(int argc, char *argv[])
{
// QApplication a(argc, argv);
// MainWindow w;
// w.show();// return a.exec();//初始化python解释器Py_Initialize();if (!Py_IsInitialized()){qDebug()<<"init failed!";return 0;}//初始化python系统文件路径,保证可以访问到 .py文件
// PyRun_SimpleString("import sys");
// PyRun_SimpleString("sys.path.append('./')");//调用python文件名。当前的测试python文件名是 pyFile.pyPyObject* pModule = NULL;pModule = PyImport_ImportModule("pyFile");if (!pModule){qDebug()<< "open python file failed!";return 0;}//调用函数,函数名AddFuncPyObject* pFunc = NULL;pFunc = PyObject_GetAttrString(pModule, "AddFunc");if(!pFunc){qDebug() << "get function failed!";return 0;}//给python传参数// 函数调用的参数传递均是以元组的形式打包的,2表示参数个数PyObject* pArgs = PyTuple_New(2);//第一个参数,传入 int 类型的值 2PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));//第二个参数,传入 int 类型的值 4PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4));//使用C++的python接口调用该函数PyObject* pReturn = PyObject_CallObject(pFunc, pArgs);//接收python计算好的返回值int value;// i表示转换成int型变量。// 在这里,最需要注意的是:PyArg_Parse的最后一个参数,必须加上“&”符号PyArg_Parse(pReturn, "i", &value);qDebug() << "result is " << value;//8、结束python接口初始化Py_Finalize();
}
Crtl+R,运行程序。在程序的问题窗口出现如下错误提示,双击错误提示,打开“object.h”文件
在错误提示代码的前后加上如下代码
再次运行程序,程序输出框中出现如下内容,表示调用成功。
- 如果程序输出框中输出“open python file failed!”,查看自己创建的py文件是否和Qt程序生成的可执行文件exe在同一个文件夹中或者py文件中的代码是否编写正确;
- 如果程序输出框中输出“get function failed!”,查看Qt中调用的py文件中的函数名与实际py文件中的函数名是否一致;
- 如果程序输出框输出“程序异常结束”,查看是否配置了Python的环境变量: