当前位置: 首页 > 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…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...