一、开发环境
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.py
PyObject* pModule = NULL;
pModule = PyImport_ImportModule("pyFile");
if (!pModule)
{
qDebug()<< "open python file failed!";
return 0;
}
//调用函数,函数名AddFunc
PyObject* pFunc = NULL;
pFunc = PyObject_GetAttrString(pModule, "AddFunc");
if(!pFunc)
{
qDebug() << "get function failed!";
return 0;
}
//给python传参数
// 函数调用的参数传递均是以元组的形式打包的,2表示参数个数
PyObject* pArgs = PyTuple_New(2);
//第一个参数,传入 int 类型的值 2
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));
//第二个参数,传入 int 类型的值 4
PyTuple_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的环境变量: