QT中调用python
一.概述
1.Python功能强大,很多Qt或者c/c++开发不方便的功能可以由Python编码开发,尤其是一些算法库的应用上,然后Qt调用Python。
2.在Qt调用Python的过程中,必须要安装python环境,并且Qt Creator中编译器与Python的版本要对应,具体来说编译器是64位安装Python就是64位,编译器32位安装Python就是32位。
3.本文测试使用的QT版本为:QT5.12; python版本为python-3.12
4.Qt调用python主要有两种方式:
一是混合编程模式,直接调用python文件内的函数,比较灵活,也是本文重点讲述的方法;
二是直接调用python脚本文件,比较简单,但是不够灵活。
二.混合编程代码实现
1.环境配置
(1)pro文件中添加python的头文件和依赖库:
INCLUDEPATH += -I D:\python\Lib\site-packages\numpy\core\include
INCLUDEPATH += -I D:\python\include
LIBS += -L D:\python\libs -l_tkinter -lpython3 -lpython312
(2)修改include文件夹中的object.h文件,因为Python中slots是关键字,Qt中slots也是关键字,会冲突。
#undef slots
PyType_Slot *slots; /* terminated by slot==0. */
#define slots Q_SLOTS
2.代码实现
(1)Python代码添加目录及内容
添加test1.py文件到qt生成exe目录,比如:
../build-qt_python-Desktop_Qt_5_12_10_MinGW_64_bit-Debug/debug/testb.py
否则无法调用py文件。
Python代码:
def hello():
print("hello")
def mix(a,b):
print("=======================")
r1 = a + b
r2 = a - b
return (r1, r2)
2.qt代码
#include <QCoreApplication>
#include <Python.h>
#include <QDebug>
#include <numpy/arrayobject.h>
int Test_hello(void)
{
//初始化python模块
Py_Initialize();
if ( !Py_IsInitialized() )
{
return -1;
}
//导入testb.py模块
PyObject* pModule = PyImport_ImportModule("testb");
if (!pModule) {
qDebug("Cant open python file!\n");
return -1;
}
//获取test模块中的hello函数
PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");
if(!pFunhello){
qDebug()<<"Get function hello failed";
return -1;
}
//调用hello函数
PyObject_CallFunction(pFunhello,NULL);
//结束,释放python
Py_Finalize();
return 0;
}
int Testt_mix(void)
{
//初始化python模块
Py_Initialize();
if ( !Py_IsInitialized() )
{
return -1;
}
PyObject* pModule = PyImport_ImportModule("testb");//注意文件名字大小写
if (!pModule) {
qDebug("Cant open python file!\n");
return -1;
}
PyObject* pyFunc_mix = PyObject_GetAttrString(pModule, "mix");
if (pModule && PyCallable_Check(pyFunc_mix))
{
PyObject* pyParams = PyTuple_New(2); //定义两个变量
PyTuple_SetItem(pyParams, 0, Py_BuildValue("i", 5));// 变量格式转换成python格式
PyTuple_SetItem(pyParams, 1, Py_BuildValue("i", 2));// 变量格式转换成python格式
int r1 = 0, r2 = 0;
PyObject* pyValue = PyObject_CallObject(pyFunc_mix, pyParams); //调用函数返回结果
PyArg_ParseTuple(pyValue, "i|i", &r1, &r2);//分析返回的元组值
if (pyValue)
{
qDebug("result: %d %d\n", r1, r2);
}
}
//结束,释放python
Py_Finalize();
return 0;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test_hello();
Testt_mix();
return a.exec();
}
3.输出结果

三.直接调用python脚本模式
1.python文件
import sys
def test():
a = 1
print (a)
if __name__=='__main__':
b = test()
print (b)
2.QT代码
//第一步:初始化Python
Py_Initialize();
//检查初始化是否完成
if (!Py_IsInitialized())
{
return -1;
}
//第二步:导入sys模块
PyRun_SimpleString("import sys");
const char* code = "with open('./debug/scriptpy.py', 'r') as file: exec(file.read())";
// 执行代码字符串
if (PyRun_SimpleString(code) != 0)
{
// 处理错误
PyErr_Print();
return -1;
}
Py_Finalize();
3.执行结果

相关文章:
QT中调用python
一.概述 1.Python功能强大,很多Qt或者c/c开发不方便的功能可以由Python编码开发,尤其是一些算法库的应用上,然后Qt调用Python。 2.在Qt调用Python的过程中,必须要安装python环境,并且Qt Creator中编译器与Python的版…...
Sora基础知识学习
...
开源博客项目Blog .NET Core源码学习(9:Autofac使用浅析)
开源博客项目Blog使用Autofac注册并管理组件和服务,Autofac是面向.net 的开源IOC容器,支持通过接口、实例、程序集等方式注册组件和服务,同时支持属性注入、方法注入等注入方式。本文学习并记录Blog项目中Autofac的使用方式。 整个Blog解…...
Go语言中的TLS加密:深入crypto/tls库的实战指南
Go语言中的TLS加密:深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置:tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…...
网络原理-TCP/IP(7)
目录 网络层 路由选择 数据链路层 认识以太网 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 认识MTU ARP协议 ARP协议的作用 ARP协议工作流程 重要应用层协议DNS(Domain Name System) DNS背景 NAT技术 NAT IP转换过程 NAPT NAT技术的优缺点 网络层 路由…...
HarmonyOS4.0系列——08、整合UI常用组件
HarmonyOS4.0 系列——08、UI 组件 Blank Blank 组件在横竖屏占满空余空间效果 // xxx.ets Entry Component struct BlankExample {build() {Column() {Row() {Text(Button).fontSize(18)Blank()Toggle({type: ToggleType.Switch}).margin({top: 14,bottom: 14,left: 6,righ…...
【Spring Boot 3】【JPA】一对多单向关联
【Spring Boot 3】【JPA】一对多单向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...
工信部等九部门:打造一批实现制造过程数字孪生的数字化转型标杆工厂
“人工智能技术与咨询” 发布 培育一批科技领军人才、青年骨干人才,以及一批既懂原材料工业又懂数字技术的复合型人才。依托职业教育提质培优行动计划,加速培育数字化转型急需紧缺的工程师和技术技能人才。支持引进数字化转型海外高端人才。 ÿ…...
并发编程(2)基础篇-管程
4 共享模型之管程 本章内容 共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock 4.1 共享带来的问题 4.1.1 小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去ÿ…...
OpenAI文生视频大模型Sora概述
Sora,美国人工智能研究公司OpenAI发布的人工智能文生视频大模型(但OpenAI并未单纯将其视为视频模型,而是作为“世界模拟器” ),于2024年2月15日(美国当地时间)正式对外发布。 Sora可以根据用户…...
[linux]进程间通信(IPC)———共享内存(shm)(什么是共享内存,共享内存的原理图,共享内存的接口,使用演示)
一、什么是共享内存 共享内存区是最快的(进程间通信)IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。注意:…...
Go 原子操作有哪些?
Go atomic包是最轻量级的锁(也称无锁结构),可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作,不过这个包只支持int32/int64/uint32/uint64/uintptr这几种数据类型的一些基础操作(增减、交换、载入、存…...
爬虫知识--02
免费代理池搭建 # 代理有免费和收费代理 # 代理有http代理和https代理 # 匿名度: 高匿:隐藏访问者ip 透明:服务端能拿到访问者ip 作为后端,如何拿到使用代理人的ip 请求头中:x-forwor…...
SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测
SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测 目录 SCI一区 | Matlab实现GAF-PCNN-MSA格拉姆角场和双通道PCNN融合注意力机制的多特征分类预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实…...
Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型
作者: 来自 Elastic David Hope ChatGPT 现在非常火爆,甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员,我对这项技术的可能性感到非常兴奋。 我看到的情况是,基于 ChatGPT 的解决方案将会呈指数级…...
靡语IT:Vue精讲(一)
Vue简介 发端于2013年的个人项目,已然成为全世界三大前端框架之一,在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年,在Google工作的尤雨溪,受到Angular的启发,从中提取自…...
vue3 toRefs之后的变量修改方法
上效果 修改值需要带上解构之前的对象名obj, changeName:()>{ // toRefs 解决后变量修改值方法: 解构前变量.字段新值 obj.name FEIFEI; } } 案例源码 <!DOCTYPE html> <html> <head><me…...
【教程】详解相机模型与坐标转换
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来,如果有格式问题,推荐大家直接去我原网站上查看: 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…...
171基于matlab的随机共振微弱信号检测
基于matlab的随机共振微弱信号检测,随机共振描述了过阻尼布朗粒子受周期性信号和随机噪声的共同作用下,在非线性双稳态系统中所发生的跃迁现象. 随机共振可用于弱信号的检测。程序已调通,可直接运行。...
petalinux_zynq7 驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用
前文: petalinux_zynq7 C语言驱动DAC以及ADC模块之一:建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二:petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…...
智能车竞赛避坑指南:直道、弯道、十字路口图像识别,我的MT9V03X摄像头调试血泪史
智能车竞赛避坑指南:MT9V03X摄像头调试的七个关键陷阱 全国大学生智能汽车竞赛中,图像识别环节往往是决定胜负的关键。作为曾经在赛场上摸爬滚打的参赛者,我深刻理解使用MT9V03X摄像头调试过程中的种种痛苦——那些深夜调试、反复修改参数却…...
哔哩下载姬(downkyi)全功能指南:从入门到精通的视频下载解决方案
哔哩下载姬(downkyi)全功能指南:从入门到精通的视频下载解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水…...
从GDF到特征矩阵:基于MNE的BCI Competition IV 2a运动想象数据全流程预处理指南
1. 从GDF到特征矩阵:BCI数据预处理的完整路线图 当你第一次拿到BCI Competition IV 2a数据集时,面对GDF格式的原始EEG数据可能会感到无从下手。这套数据记录了9名受试者在执行四类运动想象任务(左手、右手、双脚、舌头)时的脑电活…...
Flux Sea Studio 效果深度评测:对比不同采样器与步数下的海景细节
Flux Sea Studio 效果深度评测:对比不同采样器与步数下的海景细节 最近在尝试用AI生成一些海景图,发现Flux Sea Studio的效果确实让人眼前一亮。但我也遇到了不少朋友都有的困惑:为什么同样的描述词,别人生成的浪花层次分明、光线…...
KART-RERANK与MySQL集成:构建企业级智能搜索系统
KART-RERANK与MySQL集成:构建企业级智能搜索系统 你是不是也遇到过这样的问题?自家电商平台或者内容社区里,用户搜“适合夏天穿的轻薄外套”,结果系统返回一堆“冬季加厚羽绒服”或者“春秋季夹克”。用户抱怨搜不准,…...
Ip2region终极指南:如何快速部署高性能离线IP定位系统
Ip2region终极指南:如何快速部署高性能离线IP定位系统 【免费下载链接】ip2region Ip2region (2.0 - xdb) 是一个离线IP地址管理与定位框架,能够支持数十亿级别的数据段,并实现十微秒级的搜索性能。它为多种编程语言提供了xdb引擎实现。 项…...
Coze插件实战:如何给你的AI小游戏添加图片生成和数据库功能
Coze插件实战:打造沉浸式AI小游戏的进阶技巧 想象一下,你正在开发一款让用户体验挥霍10亿财富的AI小游戏。用户每次选择不同的消费方式,都会触发一段图文并茂的故事情节,最终目标是花光所有钱。这种游戏不仅需要动态生成故事内容&…...
告别环境配置!M2FP镜像开箱即用,快速体验人体语义分割
告别环境配置!M2FP镜像开箱即用,快速体验人体语义分割 1. 为什么选择M2FP镜像 1.1 人体语义分割的实用价值 人体语义分割是计算机视觉领域的重要技术,它能将图像中的人体细分为不同部位(如头部、上衣、裤子等)。这项…...
终极STL转STEP指南:如何轻松实现3D网格到CAD实体的无缝转换
终极STL转STEP指南:如何轻松实现3D网格到CAD实体的无缝转换 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在3D设计和制造领域,数据格式的兼容性问题常常成为工作流程中…...
OpenClaw+GLM-4.7-Flash:个人旅行计划自动生成与优化
OpenClawGLM-4.7-Flash:个人旅行计划自动生成与优化 1. 为什么需要AI旅行助手? 去年夏天,我计划带家人去云南旅行时,花了整整三个晚上对比机票价格、筛选酒店、计算景点间的交通时间。当我在凌晨两点盯着Excel表格里混乱的日期和…...
