C++(Qt)与Python混合编程(一)

最近由于项目需求,需要使用python来做一些算法的实现。但是需要将python实现的代码集成到Qt中,借此机会接触到C++和Python混合编程。

开发环境:Qt5.9.9(MSVC64_bit)+Python3.6.0(64bit) (建议在创建项目的时候选择MSVC64_bit配合Python的64位,避免不必要的错误!)

一、将Python集成到Qt中

1.安装Python环境

2.配置 python 解释器

工具->选项->环境->外部工具
在这里插入图片描述
添加->添加目录 (双击可任意更改名称这里更改为RunPy)->添加工具(双击可任意更改名称这里更改为Python3)
在这里插入图片描述
点击Python3,配置执行档、参数等配置
在这里插入图片描述
说明:可以是任何文字;

执行档:python的安装目录,我这里是(E:\Python36\python.exe),你自己找到自己安装的python.exe目录

参数:%{CurrentDocument:FilePath}

工作目录:%{CurrentDocument:Path}

二、在Qt中创建一个Python脚本测试

在这里插入图片描述
在新建的Python脚本中编写代码(matplotlib等其他Python库需要去cmd命令行 pip install xxx 安装一下)

在这里插入图片描述
点击 工具->外部->RunPy->Python3,运行脚本
在这里插入图片描述
运行结果:

在这里插入图片描述

二、Qt调用Python脚本

1.在.pro文件中将python的include和lib包含进来
在这里插入图片描述

INCLUDEPATH += -I E:\Python36\include
LIBS += -LE:\Python36\libs -lpython36

在这里插入图片描述
在这里插入图片描述
至此写一个小案例来测试一下:

在main方法中编写代码:

#include "mainwindow.h"

#include <QApplication>
#include <Python.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
  //初始化python模块
       Py_Initialize();
       if ( !Py_IsInitialized() )
       {
       return -1;
       }
       PyRun_SimpleString("import sys");
       PyRun_SimpleString("sys.argv = ['python.py']");
       PyRun_SimpleString("sys.path.append('./')");

       //导入scriptSecond.py模块
       PyObject* pModule = PyImport_ImportModule("scriptSecond");
       if (!pModule) {
               printf("Cant open python file!\n");
               return -1;
           }
       //获取scriptSecond模块中的temperImg函数
      PyObject* pFunhello= PyObject_GetAttrString(pModule,"temperImg");
      //注释掉的这部分是另一种获得scriptSecond模块中的temperImg函数的方法
  //    PyObject* pDict = PyModule_GetDict(pModule);
  //       if (!pDict) {
  //           printf("Cant find dictionary.\n");
  //           return -1;
  //       }
  //    PyObject* pFunhello = PyDict_GetItemString(pDict, "temperImg");

       if(!pFunhello){
           cout<<"Get function hello failed"<<endl;
           return -1;
       }
       //调用temperImg函数
       PyObject_CallFunction(pFunhello,NULL);
       //结束,释放python
       Py_Finalize();
    return a.exec();
}

编写scriptSecond.py代码:

import matplotlib.pyplot as plt
def temperImg():
    plt.plot([1,2,1,2])
    plt.show()
temperImg()

点击运行,运行你会发现,运行结果是Cant open python file!
在这里插入图片描述
这里要特别要注意,此时你需要将你要调用的Python脚本复制到你建立的工程目录的debug文件目录下。
在这里插入图片描述
之后点击绿色的运行按钮:
在这里插入图片描述
运行成功!

然而在调试的过程中并非如此之顺利,现在我将我在运行过程中遇到的其他问题以及我在网上找到的可行方法在此总结一下:

1、打不开python.h文件

先确定python的include和libs是否在.pro文件包含正确。确认正确之后,点击构建文件->构建所有文件。

2、在创建.py文件命名为test.py,会和python定义的test.py重复,运行会报错找不到.py文件。所以不要将.py文件命名为test.py。

3、👎 error: LNK1104: 无法打开文件“python36_d.lib”

在Python36的include文件夹下找到pyconfig.h文件,将python36_d.lib更改为python36.lib
在这里插入图片描述
4、numpy版本过高导致环境错误,建议使用numpy1.16.0

pip install numpy==1.16.0

pip install --user numpy==1.16.0

5、将.py文件中的函数名命名为fun(),会报错。不建议将python脚本的函数命名为fun()

6、当程序你已经吧Python脚本放置到Debug文件下并且一切准备工作都没有问题的情况下。qDebug显示 pModule is null,这很有可能是因为你的Python文件有语法等错误,建议检查一下Python脚本写的代码。

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的应用程序开发框架,常用于C++开发。Python是一种动态类型的脚本语言。混合编程指的是在一个项目中同时使用Qt/C++Python进行开发。 混合编程的好处是可以充分发挥QtPython各自的优势。Qt/C++可以提供高性能和可靠性,适用于底层开发和系统级编程Python则提供了简洁易懂、高效编程以及大量的第三方库,适用于快速开发和原型设计。 混合编程的打包过程可以分为以下几个步骤: 首先,需要安装相应的编译工具和开发环境,如QtC++编译器和Python解释器。确定使用的Qt版本与Python版本兼容。 其次,需要为C++部分编写Qt代码,并将其编译成dll或so动态链接库,以供Python调用。这需要使用Qt提供的相关工具和库进行编译和链接。 然后,使用Python的相关库(如PyQt或PySide)来调用C++部分的Qt代码,并将其与Python代码结合起来。这样,就可以实现Qt界面与Python逻辑的交互。 最后,将项目打包成可执行文件、二进制文件或安装包。这可以使用Qt提供的打包工具,如Qt Installer Framework,或者使用第三方工具和脚本来完成。 需要注意的是,在混合编程和打包过程中,需要仔细处理Qt的信号与槽机制与Python的回调机制之间的交互,以确保二者能够正常工作。 总之,Qt C++Python混合编程可以充分利用两者的优势,打包则需要注意兼容性和交互的处理。这种方式可以更灵活地开发应用程序,并能够适应不同的需求和平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值