26、Qt调用.py文件中的函数

一、开发环境

Qt5.12.0

Python3.7.8 64bit

二、使用

新建一个Qt项目,右击项目名称,选择“添加库”

选择“外部库”,点击“下一步”

点击“浏览”,选择Python安装目录下的libs文件夹中的“python37.lib”文件,点击“下一步”

点击“完成”

.pro文件中出现如下代码,删除掉红框中37之后的“d”(此处删除d是因为在Python安装目录下的libs文件夹中只有python37.lib,没有python37d.lib)

再手动添加上第43和44行代码

右击项目,选择“构建”

构建完成后,在构建目录下创建一个py文件

在py文件中自定义一个简单的加法函数

def AddFunc(a, b):print("AddFunc: ")print("{} + {} = {}".format(a, b, a+b))return a + b

回到Qt中,更改main.cpp代码如下 

#include "mainwindow.h"
#include <QApplication>
#include <Python.h>
#include <QDebug>int main(int argc, char *argv[])
{
//    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();//   return a.exec();//初始化python解释器Py_Initialize();if (!Py_IsInitialized()){qDebug()<<"init failed!";return 0;}//初始化python系统文件路径,保证可以访问到 .py文件
//    PyRun_SimpleString("import sys");
//    PyRun_SimpleString("sys.path.append('./')");//调用python文件名。当前的测试python文件名是 pyFile.pyPyObject* pModule = NULL;pModule = PyImport_ImportModule("pyFile");if (!pModule){qDebug()<< "open python file failed!";return 0;}//调用函数,函数名AddFuncPyObject* pFunc = NULL;pFunc = PyObject_GetAttrString(pModule, "AddFunc");if(!pFunc){qDebug() << "get function failed!";return 0;}//给python传参数// 函数调用的参数传递均是以元组的形式打包的,2表示参数个数PyObject* pArgs = PyTuple_New(2);//第一个参数,传入 int 类型的值 2PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));//第二个参数,传入 int 类型的值 4PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4));//使用C++的python接口调用该函数PyObject* pReturn = PyObject_CallObject(pFunc, pArgs);//接收python计算好的返回值int value;// i表示转换成int型变量。// 在这里,最需要注意的是:PyArg_Parse的最后一个参数,必须加上“&”符号PyArg_Parse(pReturn, "i", &value);qDebug() << "result is " << value;//8、结束python接口初始化Py_Finalize();
}

Crtl+R,运行程序。在程序的问题窗口出现如下错误提示,双击错误提示,打开“object.h”文件

 在错误提示代码的前后加上如下代码

再次运行程序,程序输出框中出现如下内容,表示调用成功。

  • 如果程序输出框中输出“open python file failed!”,查看自己创建的py文件是否和Qt程序生成的可执行文件exe在同一个文件夹中或者py文件中的代码是否编写正确;
  • 如果程序输出框中输出“get function failed!”,查看Qt中调用的py文件中的函数名与实际py文件中的函数名是否一致;
  • 如果程序输出框输出“程序异常结束”,查看是否配置了Python的环境变量:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

退休开便利店真的靠谱吗?2024比较赚钱的创业项目排行

近日多个退休后开便利店赚钱的新闻登上热搜&#xff0c;但是&#xff0c;小编对此有疑问&#xff0c;退休的老年人开便利店真的是一个好选择吗&#xff1f; 第一、便利店最基本的转让费&#xff0c;装修费&#xff0c;进货等等&#xff0c;这笔开支非常大&#xff0c;足以掏空老…

H5下拉刷新分页

对于分页需求&#xff0c;分页数据的请求触发十分重要&#xff0c;监听滑动到底的触发也有很多种。 1.IntersectionObserver监听 IntersectionObserver 接口&#xff08;从属于 Intersection Observer API&#xff09;提供了一种异步观察目标元素与其祖先元素或顶级文档视口&a…

终结数据混乱!开发者必学的GraphQL秘籍,高效API只需一步

在数字世界中&#xff0c;API就如同城市中的道路&#xff0c;连接着各种服务和数据。然而&#xff0c;传统的API&#xff08;如RESTful&#xff09;虽然功不可没&#xff0c;但随着技术复杂性和需求多样性不断攀升&#xff0c;它们显露出的局限性也呼唤着新的可能出现。此时&am…

Unity中,activeInHierarchy 和 activeSelf

activeInHierarchy&#xff1a; activeInHierarchy 属性表示游戏对象是否在场景中处于激活状态&#xff0c;并且是否在层次结构中的激活状态。它考虑了游戏对象以及其所有父对象的激活状态。如果 activeInHierarchy 为 true&#xff0c;表示该对象在场景中处于激活状态且其所有…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

《PyTorch深度学习实践》第十三讲RNN进阶

一、 双向循环神经网络&#xff08;Bidirectional Recurrent Neural Network&#xff0c;BiRNN&#xff09;是一种常见的循环神经网络结构。与传统的循环神经网络只考虑历史时刻的信息不同&#xff0c;双向循环神经网络不仅考虑历史时刻的信息&#xff0c;还考虑未来时刻的信息…

wireshark过滤和tcpdump抓包指令

Wireshark 过滤器的表达式&#xff0c;用于过滤源 IP 地址为 10.184.148.247 并且目标 TCP 端口为 1883 的数据包。启用抓包后过滤 ip.addr 10.184.148.247 && tcp.port 1883 主机位10.184.148.19和目标端口为 8080 的操作目标 抓包前过滤 host 10.184.148.19 &…

软件说明书怎么写?终于有人一次性说清楚了!

每次写软件说明书&#xff0c;你是不是总是毫无头绪&#xff0c;不知道从何下手&#xff1f;到各网站找资料&#xff0c;不仅格式不规范&#xff0c;甚至可能遗漏关键内容&#xff01;挨一顿批不说&#xff0c;还浪费大把时间。别着急&#xff0c;编写软件说明书&#xff0c;关…

PostgreSQL开发与实战(2)常用命令

作者&#xff1a;太阳 1、连库相关 #连库 $ psql -h <hostname or ip> -p <端口> [数据库名称] [用户名称] #连库并执行命令 $ psql -h <hostname or ip> -p <端口> -d [数据库名称] -U <用户名> -c "运行一个命令;"备注&#xff1…

从理论到落地,大模型评测体系综合指南

1956年夏&#xff0c;“人工智能” 这一概念被提出。距今已有近70年的发展历史。中国科学院将其划分为六个阶段&#xff1a;起步发展期&#xff08;1956年—1960s&#xff09;&#xff0c;反思发展期&#xff08;1960s-1970s&#xff09;,应用发展期&#xff08;1970s-1980s),低…

SpringBoot集成Activiti案例

前言 Activiti项目是一项新的基于Apache许可的开源BPM平台&#xff0c;从基础开始构建&#xff0c;旨在提供支持新的BPMN 2.0标准&#xff0c;包括支持对象管理组&#xff08;OMG&#xff09;&#xff0c;面对新技术的机遇&#xff0c;诸如互操作性和云架构&#xff0c;提供技…

3.1log | 62.不同路径,63. 不同路径 II,343. 整数拆分,96.不同的二叉搜索树

62.不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));for(int i0;i<n;i) dp[0][i]1;for(int i0;i<m;i) dp[i][0]1;for(int i1;i<m;i){for(int j1;j<n;j){dp[i][j]dp[i][j-1]dp[i-…

c++八股文:c++编译与内存管理

文章目录 1. c内存管理2. 堆与栈3.变量定义与生命周期4.内存对齐5.内存泄露6.智能指针7.new 和 malloc 有什么区别8.delete和free的区别9.什么野指针&#xff0c;怎么产生的&#xff0c;如何避免野指针10.野指针和指针悬浮的区别11.字符串操作函数参考 1. c内存管理 c在运行程…

LeetCode刷题--- 乘积为正数的最长子数组长度

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述动…

ScheduledThreadPoolExecutor学习

简介 ScheduledThreadPoolExecutor 是 Java 中的一个类&#xff0c;它属于 java.util.concurrent 包。这个类是一个线程池&#xff0c;用于在给定的延迟后运行命令&#xff0c;或者定期地执行命令。它是 ThreadPoolExecutor 的一个子类&#xff0c;专门用于处理需要定时或周期…

解释索引是什么以及它们是如何提高查询性能的

索引在数据库管理系统中是一个重要的数据结构&#xff0c;用于帮助快速检索数据库表中的数据。它可以被看作是一个指向表中数据的指针列表&#xff0c;这些指针按照某种特定的顺序&#xff08;如字母顺序或数字顺序&#xff09;排列。索引的工作原理类似于书籍的目录&#xff1…

Python爬虫实战第二例【二】

零.前言&#xff1a; 本文章借鉴&#xff1a;Python爬虫实战&#xff08;五&#xff09;&#xff1a;根据关键字爬取某度图片批量下载到本地&#xff08;附上完整源码&#xff09;_python爬虫下载图片-CSDN博客 大佬的文章里面有API的获取&#xff0c;在这里我就不赘述了。 一…

kitex 入门和基于grpc的使用

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于kitex系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系…

【Web】青少年CTF擂台挑战赛 2024 #Round 1 wp

好家伙&#xff0c;比赛结束了还有一道0解web题是吧( 随缘写点wp(简单过头&#xff0c;看个乐就好) 目录 EasyMD5 PHP的后门 PHP的XXE Easy_SQLi 雏形系统 EasyMD5 进来是个文件上传界面 说是只能上传pdf&#xff0c;那就改Content-Type为application/pdf&#xff0c;改…

11.盛最多水的容器

题目&#xff1a;给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 解题思路&#xff1a;可以…