Qt调用python函数(python已经安装的情况下)

Qt中加载python环境

1、首先将python文件(.py)放在qt的工程文件目录下和qt的exe文件在同一文件夹。其中LightAlgorithm.py是我需要的python文件

2、将python文件在qt中加载,打开qt,选中项目,鼠标右键选中添加现有文件,选中自己需要的python文件,点击确认即可添加,右图为效果

3、进入qt的pro文件添加python的环境,右键选择添加库。

其中库文件选择python目录下的libs文件夹中的pythonxxx.lib,例如我的python版本是python312,我选择的就是python312.lib;包含路径选择ython目录下的include文件夹即可,取消勾选linux、Mac,同时将连接勾选为静态,windows选择那部分全部取消勾选,一直点击下一步到结束即可

结束后会在pro文件中生成下图上的代码,其中
else:win32-g++: PRE_TARGETDEPS += $$PWD/../../APP/python/libs/libpython312.a
需要进行注释,否则运行会报错,至此qt加载python结束。

qt调用python的函数

1、添加头文件,在调用python的类中添加此头文件,必须使用该方式,否则会和qt中的slots造成冲突问题。

#pragma push_macro("slots")
#undef slots
#include <Python.h>
#pragma pop_macro("slots")

2、初始化,在调用python之前必须进行初始化操作,一般在构造函数中初始化

Py_Initialize();
    if (!Py_IsInitialized()) {
        qDebug() << "Fail to init Python.";
    }

3、加载python文件的路径

    PyRun_SimpleString("import sys");
    std::string path = "sys.path.append('D:/Qt_Project/light/debug')"; //D:/Qt_Project/light/debug 是我python文件所在的路劲,根据自己文件位置进行更改
    PyRun_SimpleString(&path[0]);

4、加载自己的python文件

    PyObject * pModule = PyImport_ImportModule("LightAlgorithm");
    if (!pModule)
    {
        qDebug() <<"Fail to load Python module (LightAlgorithm.py)";
    }

此时可以运行一下啊,如果找不到该文件,可以将该文件的路径加载在环境变量中,例如该文件路径为D:/Qt_Project/light/debug,在环境变量中添加该路径即可解决。

5、找到自己需要调用的函数

PyObject * pFunc = PyObject_GetAttrString(pModule, "ReflexFunc");
    if(!pFunc)
    {
        qDebug() << "Cant find function ReflexFunc().\n";
    }

6、根据自己所写的函数的参数进行参数调用

    //我的参数为列表,需要使用该方法进行调用
    PyObject *pArgs = PyTuple_New(2); //创建大小为2的列表作为调用python的参数使用
    PyTuple_SetItem(pArgs, 0, PyList_New(0)); //设置第一个列表为空
    PyTuple_SetItem(pArgs, 1, PyList_New(0)); //设置第二个列表为空

    //光线方向向量装入列表
    PyList_Append(PyTuple_GetItem(pArgs, 0), PyFloat_FromDouble(a));
    PyList_Append(PyTuple_GetItem(pArgs, 0), PyFloat_FromDouble(b));
    PyList_Append(PyTuple_GetItem(pArgs, 0), PyFloat_FromDouble(c));

    //镜面法向量装入列表
    PyList_Append(PyTuple_GetItem(pArgs, 1), PyFloat_FromDouble(x));
    PyList_Append(PyTuple_GetItem(pArgs, 1), PyFloat_FromDouble(y));
    PyList_Append(PyTuple_GetItem(pArgs, 1), PyFloat_FromDouble(z));

    PyObject *pValue = PyObject_CallObject(pFunc, pArgs); // 调用python内的函数
    PyObject *iter = PyObject_GetIter(pValue); // 接收python的返回值

只是简单值调用可以用下列方法

有参调用

PyObject_CallFunction(pFunc,"s","hello python");//pFunc表示调用得函数,i'表示整数,'d'表示双精度浮点数,'s'表示字符串等,中间数量代表参数个数,"hello python"表示传入得参数

无参调用

PyObject_CallFunction(pFunc1, NULL);

7、释放python,最好在析构函数中,至于怎么获取到返回值,不做讲解

Py_Finalize();//释放python

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值