26、Qt调用.py文件中的函数

一、开发环境

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的环境变量:

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值