qt python 传参数 qt调用python函数

admin2024-06-01  13

Qt中加载python环境

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

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_加载,第1张

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

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_python_02,第2张

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_qt_03,第3张

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

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_qt_04,第4张

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_qt_05,第5张

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

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_qt python 传参数_06,第6张

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

qt python 传参数 qt调用python函数,qt python 传参数 qt调用python函数_加载_07,第7张

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!