前言:在做项目的过程中,需要使用QT来调用Python3写的脚本文件,经过一番折腾终于搞定,现记录在此方便查询。

0、开发环境

win10_64、QT5.10.1 msvc2015_64、Python3.7

1、QT中添加python脚本

QT Creator是支持添加Python脚本的,可以在工程文件上新添文件中选择“python”。

qtcreator添加python包 qt如何调用python_python

2、pro文件设置

在完成此步骤前,需保证用户机器上安装好了Python对应版本,作者机器上安装的是Python3.7。然后参照下图配置文件,用户参考自己机器中Python安装位置进行设置。

qtcreator添加python包 qt如何调用python_第三方库_02

3、调用格式

添加头文件 #include <Python.h> ,调用Python脚本中的函数方法可参考如下:

#include <Python.h>

void MainWindow::function()
{
    //初始化Python解释器,这是调用操作的第一步
    Py_Initialize();
    if ( !Py_IsInitialized() )
    {
         return ;
    }
    //获取SVR.py模块的指针
    PyObject* pModule = PyImport_ImportModule("SVR");
    if (!pModule)
    {
           cout<< "Cannot open python file!\n" << endl;
           qDebug()<<"cannot open python file";
           return ;
    }

    //获取Pb_SVR函数的指针
    PyObject* pFun= PyObject_GetAttrString(pModule,"Pb_SVR");
    if(!pFun)
    {
       cout<<"Get function Pb_SVR failed"<<endl;
       qDebug()<<"Get function Pb_SVR failed";
       return ;
    }
    else
    {
       /* 用户代码  */
    }
    //销毁Python解释器,这是调用的最后一步
    Py_Finalize();
}

用户在编写好自己的任务函数后,此时若去编译工程,会报error:error: expected unqualified-id before ';' token的错,原因是Python中object.h头文件中定义的slots与QT自身的slots冲突,为解决该问题需修改头文件。(ps:Python脚本文件应使用Release模式下编译)

4、Python中object.h头文件的修改

找到object.h文件第440行左右的结构体。按下图所示,增添如黄框所示的两行代码即可。

qtcreator添加python包 qt如何调用python_python_03

5、运行

编译通过后,需将.py文件拷贝到可执行文件.exe同目录下,若用户编写的python脚本中调用了第三方库,则需要同时将第三方库也拷贝到该目录下。Python第三方库文件在安装目录下的Lib文件下的site-packages文件夹下里,如作者的在D:\CodingSoft\Python3\Lib\site-packages 。(注意:作者在release文件夹中添加第三方库文件时遇到一个运行错误,当我将高版本的第三方库文件导入时,运行程序会崩溃;但是当我导入低版本库时,程序却运行正常,怀疑与Python脚本中使用的三方库版本有关)

qtcreator添加python包 qt如何调用python_qtcreator添加python包_04

6、打包

在作者使用的机器上完成了整个程序的编译工作且能正常运行,现需要将其安装发布在目标机上运行,现记录过程。

这里采用最简单的方法:由于Python3的离线安装包大小也才200MB左右,因此完全可以直接在目标机上安装一个同版本的Python,然后将需要用到的第三方库文件导出到打包路径下,最后使用网上推荐的QT自带的windeployqt.exe打包工具打包就行。