Qt调用python代码(一)

由于工作需要,博主需要在Qt中引入python的库进行画图,以下为调试过程记录:

1.由于雷达画图所需要用到的库cinrad对于python的要求是3.10及以上,然而博主的Qt版本所用的是Qt5.12.9。在适配过程中调用python初始化函数出现了函数无法识别等一系列离谱的错误。

在经过官网查证之后发现,python3.10版本适配的官方Qt版本为Qt5.15.2,且编译工具为MSVC2019。故从清华开源网站下载了Qt的online安装程序。

从Qt安装程序进到如图所示的位置之后,点击右上角显示的三角键,勾选Archive可以显示过往版本,这个理论上可以安装5.14之后的任意版本的Qt。

记得勾选上CDB开发工具和MSVC2019版本工具,其他的库方面,博主几乎是全装了。这里先进行测试不装也没关系,之后可以用QtTools再进行维护和更新,记得下载一个新版QtCreator,我是直接下载了最新版,没啥问题

二,安装python

这个步骤影响到后期对python的检索,图我没有存,记得要装到C的用户文件夹之外,放到其他盘,且在安装的时候要勾选上“为所有用户添加加到环境变量”与”加入python调试文件“

勾选上调试文件安装后你会发现在libs文件夹下有一个_d.lib文件,这我们后期要用到

三,进入QtCreator进行调试

首先是要在Qt的.pro文件中加入python的库,右键添加库,选择外部库

添加python的lib文件,并选择Windows:中的为debug添加d作为版本后缀选项。

添加完之后会出现四行代码,将第二行的-lpython310d改成你路径下的文件名,我这里面是已经改过的

在你所需的C头文件中添加​该Python.h路径。

然后右击项目添加.py文件随便写两个函数

​​​​​

然后在对应的.cpp文件中添加如下代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Py_SetPythonHome((const wchar_t *)(L"D:/ThePaK/Python3.8"));
    Py_Initialize();
    int i = Py_IsInitialized();
    qDebug()<<i;
    if (!Py_IsInitialized())
        qDebug()<<"失败";
    {
    //导入sys模块设置模块地址
    // PyRun_SimpleString("import sys");
    // PyRun_SimpleString("sys.path.append('./')");
    //QString setSysPath = QString("sys.path.append('%1')").arg(QCoreApplication::applicationDirPath());
    //PyRun_SimpleString(setSysPath.toStdString().c_str());
    //创建模块指针
    }
    PyObject* pModule = PyImport_ImportModule("Py_Module");
    if (!pModule)
        qDebug()<<"获取模块指针失败";
    //创建函数指针
    PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
    PyObject* pFunc2= PyObject_GetAttrString(pModule,"prin");
    if(!pFunc)
        qDebug()<<"获取函数指针1失败";
    if(!pFunc2)
        qDebug()<<"获取函数指针2失败";
    //无参函数
    PyObject* pPara2 = PyObject_CallFunction(pFunc2, 0);
    char* res3;
    PyArg_Parse(pPara2, "s", &res3);
    qDebug()<<"print(f):"<<res3;
    //创建函数参数,方法1
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("i",7));  //参数1为int型 1
    PyTuple_SetItem(pPara, 1, Py_BuildValue("i",2));  //参数2为int型 2
    //pPara = Py_BuildValue("(i,i)",1,2); //连写方式
    /*
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("s","Hello"));  //参数1为String型 "Hello"
    PyTuple_SetItem(pPara, 1, Py_BuildValue("s","World!"));  //参数2为String型 "World!"
    */
    //创建函数参数,方法2
    PyObject* args = PyTuple_New(2);        // 2个参数
    PyObject* arg1 = PyLong_FromLong(9);    // 参数一设为4
    PyObject* arg2 = PyLong_FromLong(3);    // 参数二设为3
    PyTuple_SetItem(args, 0, arg1);
    PyTuple_SetItem(args, 1, arg2);

    //调用Python函数,传入元组参数pPara
    PyObject *FuncBack = PyObject_CallObject(pFunc,args);
    //PyObject_CallObject(pFunc,nullptr); //无参数调用
    //FuncBack是返回值指针,转换获取返回值
    int res = 0;
    PyArg_Parse(FuncBack,"i",&res);
    qDebug()<<"返回值: "<<res;
    
    //调用结束,销毁
    Py_Finalize();

然后,我很疑惑的一点就出来了,先把这个项目编译一遍,应该是通过的,但是运行就会显示,唉!!!获取模块指针失败。
就这个搞得我白丝不得其解。怎么回事呢?

打开了我构建出来的debug项目文件


 

我的是这个位置,在这里面最开始是没有某个.py后缀文件的,就是那个Py_Module.py,这是我后来加的,我加上之后,代码就可以跑了。

啊!原来是早不到文件,这也太不合理了,讲道理,要是我不看,不奇思妙想一下,谁知道这里有个这个坑呢?

到这里Qt与Python调试的第一章就完结了,还有很多问题没有解决,目前可见的,我不可能一直手动将我的.py文件放进去,这不和逻辑。而且我现在只是写了两个试运行的函数,谁知道我调用了其他的复杂的函数会怎么样呢?

还有就是,我现在的python路径是固定的,我这个软件回头是要打包的,到其他PC上要怎么办?这都是问题。。。。。。。。。。。。。。。。。。。。。。再说吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值