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…...
基于SUMO与PPO的智能换道决策实战:从环境构建到模型部署
1. 环境准备与基础配置 在开始构建智能换道决策系统之前,我们需要先搭建好开发环境。这里我推荐使用Anaconda来管理Python环境,它能很好地解决不同项目之间的依赖冲突问题。我习惯为每个项目创建独立的环境,比如这次我们可以命名为"sumo…...
让足球经理游戏更真实:NewGAN-Manager 零基础配置全攻略
让足球经理游戏更真实:NewGAN-Manager 零基础配置全攻略 【免费下载链接】NewGAN-Manager A tool to generate and manage xml configs for the Newgen Facepack. 项目地址: https://gitcode.com/gh_mirrors/ne/NewGAN-Manager 还在为足球经理游戏中千篇一律…...
Multi-Agent产品创新:从单一场景到跨域协同的演进
Multi-Agent产品创新:从单一场景到跨域协同的演进 关键词:多智能体系统、产品创新、跨域协同、单一场景智能、Agent协作框架、LLM驱动Agent、分布式智能 摘要:大语言模型的爆发式发展,让智能Agent从实验室走向了大众消费级产品。本文从生活场景的真实痛点切入,逐层拆解Mul…...
HS2-HF_Patch:一键解决《Honey Select 2》三大核心问题的终极增强补丁
HS2-HF_Patch:一键解决《Honey Select 2》三大核心问题的终极增强补丁 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 厌倦了《Honey Select 2》原版…...
从VBS到VBE:一次搞懂Windows脚本编码器的前世今生与实战避坑
从VBS到VBE:Windows脚本编码器的技术考古与安全实践 在Windows系统管理的工具箱里,VBScript(VBS)曾经是自动化任务的瑞士军刀。尽管如今PowerShell和现代编程语言已成为主流,但理解VBScript及其编码器(VBE&…...
如何在MATLAB中调用Taotoken聚合大模型API进行智能分析
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何在MATLAB中调用Taotoken聚合大模型API进行智能分析 对于使用MATLAB进行科学计算、数据分析或算法开发的工程师和研究人员而言&…...
RT-Thread线程栈初始化详解:从栈溢出到精准内存管理
1. 项目概述:从栈溢出崩溃说起搞嵌入式RTOS开发,尤其是用RT-Thread的朋友,估计没少被“线程栈溢出”这个问题折磨过。程序跑着跑着就HardFault了,或者某个线程莫名其妙地“死”了,数据错乱,查到最后往往发现…...
ComfyUI Segment Anything 终极指南:一键实现精准AI图像分割
ComfyUI Segment Anything 终极指南:一键实现精准AI图像分割 【免费下载链接】comfyui_segment_anything Based on GroundingDino and SAM, use semantic strings to segment any element in an image. The comfyui version of sd-webui-segment-anything. 项目地…...
告别论文 “双杀” 困局:okbiye 如何用一套闭环方案,破解重复率与 AIGC 检测双重难题
okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 当你对着导师的红笔批注,第三次修改论文时,有没有想过一个问题:为什么你改了又改的句子,重…...
HiC-Pro跑完数据后,你的结果文件都看懂了吗?从out文件夹到可视化图谱的完整解读指南
HiC-Pro结果文件全解析:从原始数据到发表级图谱的实战指南 当HiC-Pro顺利完成运行后,面对out文件夹中密密麻麻的文件,很多研究者会陷入"数据沼泽"——明明流程跑通了,却不知道如何从这些中间文件中提取有价值的信息。本…...
