0、前言

使用Qt和Python做混合编程,充分发挥Qt GUI的图形化框架优势和Python数据处理的计算能力。复杂的计算可用到Python众多三方库,将Python需要执行的功能写成py文件,做成插件的形式,被Qt c++调用,修改py文件即可实现一套GUI框架多种内核算法的效果。本文使用Qt调用Python三方库做多高维数据MDS降维计算。

1、运行环境

以下测试在windows10主机测试成功。需要注意Qt的位数需要和Python的位数一致。

  • Qt 5.12.0 32bit,MinGW-32bit编译器。
  • Python 3.7.3 32bit

2、Python CAPI的使用文档

Python/C API Reference Manual — Python 3.10.0 documentation

3、Qt配置环境

将Python安装的文件夹复制以下内容到Qt工程中,此处是复制到release文件夹下,以便Qt生成的可执行程序能够在当前目录下找到Python。libs文件夹下有python3.dll,python37.dll,一起复制到release目录。

项目文件.pro 添加Python依赖头文件和库,指定位置为刚刚复制的文件夹内。

4、Qt调用Python示例

在需要引用Python的文件添加头文件引用,Python的slots和Qt的slots关键字冲突,所以按以下方式添加引用。

编写初始化插件接口,只用调用一次。项目头文件中添加PyObject* py_module; PyObject* py_dic; PyObject* py_func;这些变量无需用Py_DECREF清理,Python内部自动清理(测试中发现一旦清理,再次运行就崩溃)。

由于需要打包发布应用程序,因此需要指定可执行文件寻找的Python主目录,通过以下代码实现

QString path = QCoreApplication::applicationDirPath() + "/python37_32";
Py_SetPythonHome((wchar_t*)(reinterpret_cast< const wchar_t* >(path.utf16())));

若是多线程调用,则需要使用Python全局锁GIL,参考网上的资源,新建一个PyThreadStateLock类,在任何多线程调用Python的位置,先实例化一个PyThreadStateLock。

编写接口调用Python插件计算,主要用到的CAPI如下所示,使用方法可以参考官方文档说明。

  • PyList_New
  • PyList_SetItem
  • PyList_GetItem
  • Py_BuildValue
  • PyTuple_New
  • PyObject_CallObject
  • PyObject_Size
  • PyArg_Parse

被调Python三方库的接口如下:

5、程序打包发布

Qt编译的应用程序按照windeployqt常规方式打包,需要注意的是要将release文件夹下的Python文件夹复制到打包后的目录下,同时复制python3.dll,python37.dll到可执行程序的根目录。

Qt 调用Python引擎混合编程相关推荐

  1. Qt 调用MATLAB引擎混合编程

    0.前言 C/C++调用MATLAB有三个方式:调用dll文件.调用exe可执行程序和调用Engin引擎. 第一种方式利用MATLAB Coder 将MATLAB代码生成C/C++代码和相关动态链接库 ...

  2. C++调用Python(混合编程)函数整理总结

    文章目录 C++调用python概述 相关官方文档 相关函数 1.初始化python解释器环境 2.调用python脚本的静态简单方式 3.动态加载python模块并执行函数 3.1不带参数和返回值的 ...

  3. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...

    最近想运用linux系统下Qt来实现c++ 与python的混合编程,linux系统会自带python2.7版本或者python3.5版本(深度linux). Qt调用python文件需要在pro文件 ...

  4. qt web混合编程_基于Qt与MATLAB的混合编程技术

    摘要:在Qt雷达仿真系统中,数据处理及图形显示尤为重要.本文为此提出了一种Qt与MATLAB混合编程的方法.通过VC++和MATLAB混合编程技术,将MATLAB函数封装成动态链接库,Qt调用这个动态 ...

  5. Qt Creator与matlab混合编程

    Qt Creator与matlab混合编程 引言:项目要求在Qt平台下搭建基于有限元算法的光学仿真平台,首先需要进行网格划分的实现.由于网格划分算法在matlab平台下已经有非常成熟的工程以及代码,如 ...

  6. QT调用python文件

    QT调用python文件 基本步骤 1.将python文件要是使用的环境添加到环境变量中 2.新建一个QT项目 3.在.pro文件中加入需要的python库文件目录 右击项目名,然后单击"添 ...

  7. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  8. Dart 调用C语言混合编程

    Dart 调用C语言 本篇博客研究Dart语言如何调用C语言代码混合编程,最后我们实现一个简单示例,在C语言中编写简单加解密函数,使用dart调用并传入字符串,返回加密结果,调用解密函数,恢复字符串内 ...

  9. python fortran混合编程_python fortran c 混合编程

    背景 因为编程需要使用python和fortran(或者c,c++)混合编程,所以进行了一些资料查询和实验.首先尝试了f2py,但是这个项目已经很久没有更新,为了以后兼容性考虑(后期可能会使用到c++ ...

最新文章

  1. 轻松优化Jupyter Notebook:技巧、诀窍、魔法
  2. kettle性能及效率提升_开发人员掌握了这个技术,SQL效率会有几百倍的性能提升...
  3. html(超链接定义锚点与特殊符号转义)
  4. 动态的根据一个资源名获得到对应的资源id
  5. 深度强化学习探索算法最新综述,近200篇文献揭示挑战和未来方向
  6. 如何用chrome查看post get及返回的数据
  7. mysql/mariadb应该使用utf8mb4而不是utf8
  8. 第十二章_请求和响应的装饰
  9. ASP.NET中Cookie编程的基础知识
  10. fastdfs清空_FastDFS安装及使用(开山篇)
  11. 禅道外部消息提示_Spring Boot中文参考指南(2.1.6)34、消息传递
  12. Redis (三)雪崩和穿透
  13. 建议不要使用Android studio的SVN功能
  14. 【软件分析/静态程序分析学习笔记】1.静态程序分析(Static Program Analysis)介绍
  15. wps软件打不开共享超链接_wps excel 超链接 打不开 怎么解决?
  16. vue开发钉钉微应用鉴权失败
  17. Redis进击(二)搭建Redis主从复制服务集群(一主两从、反客为主)【Windows环境】
  18. finalshell连接超时怎么办
  19. linux execl()函数
  20. OpenMV与Arduino通信—串口

热门文章

  1. 思科配置计算机ip地址子网掩码,计算机系统与网络技术IP地址 子网掩码 主机号等计算复习...
  2. 50欧姆线设计 高频pcb_硬件设计基础100问(三)
  3. MySQL的主从复制云栖社区_MySQL-主从复制
  4. cad lisp 二次抛物线_学习CAD的五个段位,你是青铜还是王者?
  5. Android 系统使用USB OTG功能/打开USB Host API功能
  6. React开发(234):windows.onresize
  7. Taro+react开发(21)--注意参数格式
  8. 工作397-Wxml
  9. [html] 写一个布局,它的宽度是不固定的100%,如果让它的宽度始终是高度的一半呢?
  10. [html] 说说你对target=“_blank“的理解?有啥安全性问题?如何防范?