当前位置: 首页 > news >正文

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功能强大&#xff0c;很多Qt或者c/c开发不方便的功能可以由Python编码开发&#xff0c;尤其是一些算法库的应用上&#xff0c;然后Qt调用Python。 2.在Qt调用Python的过程中&#xff0c;必须要安装python环境&#xff0c;并且Qt Creator中编译器与Python的版…...

Sora基础知识学习

...

开源博客项目Blog .NET Core源码学习(9:Autofac使用浅析)

开源博客项目Blog使用Autofac注册并管理组件和服务&#xff0c;Autofac是面向.net 的开源IOC容器&#xff0c;支持通过接口、实例、程序集等方式注册组件和服务&#xff0c;同时支持属性注入、方法注入等注入方式。本文学习并记录Blog项目中Autofac的使用方式。   整个Blog解…...

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密&#xff1a;深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置&#xff1a;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入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...

工信部等九部门:打造一批实现制造过程数字孪生的数字化转型标杆工厂

“人工智能技术与咨询” 发布 培育一批科技领军人才、青年骨干人才&#xff0c;以及一批既懂原材料工业又懂数字技术的复合型人才。依托职业教育提质培优行动计划&#xff0c;加速培育数字化转型急需紧缺的工程师和技术技能人才。支持引进数字化转型海外高端人才。 &#xff…...

并发编程(2)基础篇-管程

4 共享模型之管程 本章内容 共享问题synchronized线程安全分析Monitorwait/notify线程状态转换活跃性Lock 4.1 共享带来的问题 4.1.1 小故事 老王&#xff08;操作系统&#xff09;有一个功能强大的算盘&#xff08;CPU&#xff09;&#xff0c;现在想把它租出去&#xff…...

OpenAI文生视频大模型Sora概述

Sora&#xff0c;美国人工智能研究公司OpenAI发布的人工智能文生视频大模型&#xff08;但OpenAI并未单纯将其视为视频模型&#xff0c;而是作为“世界模拟器” &#xff09;&#xff0c;于2024年2月15日&#xff08;美国当地时间&#xff09;正式对外发布。 Sora可以根据用户…...

[linux]进程间通信(IPC)———共享内存(shm)(什么是共享内存,共享内存的原理图,共享内存的接口,使用演示)

一、什么是共享内存 共享内存区是最快的&#xff08;进程间通信&#xff09;IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。注意&#xff1a;…...

Go 原子操作有哪些?

Go atomic包是最轻量级的锁&#xff08;也称无锁结构&#xff09;&#xff0c;可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作&#xff0c;不过这个包只支持int32/int64/uint32/uint64/uintptr这几种数据类型的一些基础操作&#xff08;增减、交换、载入、存…...

爬虫知识--02

免费代理池搭建 # 代理有免费和收费代理 # 代理有http代理和https代理 # 匿名度&#xff1a; 高匿&#xff1a;隐藏访问者ip 透明&#xff1a;服务端能拿到访问者ip 作为后端&#xff0c;如何拿到使用代理人的ip 请求头中&#xff1a;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 模型

作者&#xff1a; 来自 Elastic David Hope ChatGPT 现在非常火爆&#xff0c;甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员&#xff0c;我对这项技术的可能性感到非常兴奋。 我看到的情况是&#xff0c;基于 ChatGPT 的解决方案将会呈指数级…...

靡语IT:Vue精讲(一)

Vue简介 发端于2013年的个人项目&#xff0c;已然成为全世界三大前端框架之一&#xff0c;在中国大陆更是前端首选。 它的设计思想、编码技巧也被众多的框架借鉴、模仿。 纪略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的启发&#xff0c;从中提取自…...

vue3 toRefs之后的变量修改方法

上效果 修改值需要带上解构之前的对象名obj&#xff0c; changeName:()>{ // toRefs 解决后变量修改值方法&#xff1a; 解构前变量.字段新值 obj.name FEIFEI; } } 案例源码 <!DOCTYPE html> <html> <head><me…...

【教程】详解相机模型与坐标转换

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 由于复制过来&#xff0c;如果有格式问题&#xff0c;推荐大家直接去我原网站上查看&#xff1a; 相机模型与坐标转换 - 生活大爆炸 目录 经纬度坐标系 转 地球直角坐标系大地直角坐标系 转 经纬度坐标系地理坐标…...

171基于matlab的随机共振微弱信号检测

基于matlab的随机共振微弱信号检测&#xff0c;随机共振描述了过阻尼布朗粒子受周期性信号和随机噪声的共同作用下,在非线性双稳态系统中所发生的跃迁现象. 随机共振可用于弱信号的检测。程序已调通&#xff0c;可直接运行。...

petalinux_zynq7 驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…...

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

目录 1、概述 1.1、软件触发 1.2、硬件触发 - BCTU 1.3、硬件触发 - TRGMUX 1.4、ADC的校准 1.5、ADC时钟配置 2、BTCU硬件触发ADC的SDK配置 3、软件触发ADC 3.1、选择相应Port作为ADC的输入 3.2、ADC配置 3.3、代码示例 1、概述 恩智浦 S32K3xx 系列汽车微控制器…...

pikachu靶场-CSRF

CSRF: 介绍&#xff1a; Cross-site request forgery简称为"CSRF”。 在CSF的攻击场景中攻击者会伪造一个请求&#xff08;这个请求一般是一个链接&#xff09; 然后欺骗目标用户进行点击&#xff0c;用户一旦点击了这个请求&#xff0c;整个攻击也就完成了&#xff0…...

【结合OpenAI官方文档】解决Chatgpt的API接口请求速率限制

OpenAI API接口请求速率限制 速率限制以五种方式衡量&#xff1a;RPM&#xff08;每分钟请求数&#xff09;、RPD&#xff08;每天请求数&#xff09;、TPM&#xff08;每分钟令牌数&#xff09;、TPD&#xff08;每天令牌数&#xff09;和IPM&#xff08;每分钟图像数&#x…...

C语言实现基础数据结构——栈

目录 栈 栈的实现 数组栈 数组栈的实现 栈的初始化 栈的销毁 数据入栈 判断栈是否为空 数据出栈 获取栈顶元素 获取栈内数据个数 项目实现 栈的基础练习 有效的括号 栈 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的…...

船舶制造5G智能工厂数字孪生可视化平台,推进船舶行业数字化转型

船舶制造5G智能工厂数字孪生可视化平台&#xff0c;推进船舶行业数字化转型。随着数字化时代的到来&#xff0c;船舶行业正面临着前所未有的机遇与挑战。为了适应这一变革&#xff0c;船舶制造企业需要加快数字化转型的步伐&#xff0c;提高生产效率、降低成本并增强市场竞争力…...

【网络编程】okhttp深入理解

newCall 实际上是创建了一个 RealCall 有三个参数&#xff1a;OkHttpClient&#xff08;通用配置&#xff0c;超时时间等&#xff09; Request(Http请求所用到的条件&#xff0c;url等) 布尔变量forWebSocket&#xff08;webSocket是一种应用层的交互方式&#xff0c;可双向交互…...

大功率厚膜电阻器制造 – 优化性能?

通过优化工业大功率电阻器制造工艺&#xff0c;制造商可以提高电阻器的性能和可靠性、容差、额定电压、TCR、稳定性和额定功率。 在本文中&#xff0c;我们将介绍工业功率电阻器的制造过程。我们讨论了材料选择和生产技术及其对性能的潜在影响。 完美的电阻器 在其整个使用寿…...

ElasticStack安装(windows)

官网 : Elasticsearch 平台 — 大规模查找实时答案 | Elastic Elasticsearch Elastic Stack(一套技术栈) 包含了数据的整合 >提取 >存储 >使用&#xff0c;一整套! 各组件介绍: beats 套件:从各种不同类型的文件/应用中采集数据。比如:a,b,cd,e,aa,bb,ccLogstash:…...

gitlab的使用

前一篇文章我们已经知道Git人人都是中心&#xff0c;那他们怎么交互数据呢&#xff1f; • 使用GitHub或者码云等公共代码仓库 • 使用GitLab私有仓库 目录 一、安装配置gitlab 安装 初始化 这里初始化完成以后需要记住一个初始密码 查看状态 二、使用浏览器访问&#xf…...

基于springboot+vue的植物健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...