Qt Creator与Qt+VS2015调用Python代码的实现

21 篇文章 7 订阅
8 篇文章 0 订阅

       下面来介绍分别用Qt Creator与Qt+VS2015调用Python代码,首先电脑中要安装Python IDE与Qt。我电脑中安装的是Python37,VS2015+Qt5.8、Qt Creator5.8.0,不管是哪个版本实现步骤都是一样的,均可参照。以及出现错误

Fatal Python error: initfsencoding: unable to load the file system codec ModuleNotFoundError: No module named 'encodings' Current thread 0x000016d0 (most recent call first):的解决方法。

一、设置Python系统环境

       这俩个路径最好是放在顶端,防止电脑中安装多个版本找不到对应的系统环境,具体解释原因与产生后果可以参照我前面的博客来了解,在这就不多叙述。

二、实现

1.Qt Creator的实现

1.0创建项目

1.1在*pro文件中加入Python中的对应路径,如下:

上面的路径要根据自己电脑是对应的路径来添加。

1.2 右键方案名称新建一个*.py文件

写入函数

注意:把创建的*.py文件移动到项目对应的EXE文件目录下,不然会找不到*.py文件。

11.3在*.cpp中写入代码

#include <QCoreApplication>
#include <Python.h>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //Py_SetPythonHome(L"D:/OSGeo4W64/apps/Python37");
     //初始化python
    Py_Initialize();

    if (!Py_IsInitialized())
    {
        qDebug()<<" init failt";
        return -1;
    }
    // 导入模块
    PyObject *pModel = PyImport_ImportModule("hello");
    if (!pModel)
    {
        qDebug()<<"Can't Open Python file \n";
        return -1;
    }
    // 获取hello模块中的hello函数(无参数)
    PyObject *pFunhello = PyObject_GetAttrString(pModel,"fun");
    if (!pFunhello)
    {
        qDebug()<<"Can't find Function";
        return -1;
    }
    // 调用hello函数
    PyObject_CallFunction(pFunhello,NULL);
    
    // 获取hello模块中的mult函数(有参数,有返回值)
    PyObject *pMult = PyObject_GetAttrString(pModel,"mult");
    if (!pMult)
    {
        qDebug()<<"Can't find Function";
        return -1;
    }
    PyObject *args = Py_BuildValue("iii",2,3,4);//有几个参数就有几个i
    PyObject *pRes = PyObject_CallObject(pMult,args);
    int res =0;
    PyArg_Parse(pRes,"i",&res);
    qDebug()<<"res:"<<res;
    // 结束,释放python
    Py_Finalize();
    return a.exec();
}

结果:

2.Qt +VS2015实现

2.1项目->属性->VC++ 目录->包含目录

2.2项目->属性->VC++ 目录->库目录

2.3项目->属性->链接器->输入->附加依赖项

3.4将接下来想要调用的py文件放入项目EXE目录下。在这里我用的还是上面的那个py文件。

3.5在*.cpp中写入代码,代码与上面的一样,所以在下面我就不贴上了。

结果:

三、总结:

如果出现错误:

Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'

Current thread 0x000016d0 (most recent call first):

说明第一步的系统环境没有配置好,可以查看自己的Python系统环境是否正确,如果确定正确但仍然出现这个错误,可以把上面代码中 Py_SetPythonHome(L"D:/OSGeo4W64/apps/Python37");的注释去掉,路径改成自己电脑上的。

如果出现错误:Can't Open Python file

说明没有把*.py文件放在项目的EXE文件目录下,导致程序找不到这个py文件。

其他的错误都可以根据qDebug()的提示来改。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值