QT(6.5) cmake构建C++编程,调用python

一、注意事项

  1. explicit
    c++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色,构造器、类型转换操作符,
    c++提供关键字explicit,阻止转换构造函数进行的隐式转换的发生,声明explicit的构造函数不能在隐式转换中使用。
  2. c++ 函数前面和后面 使用const 的作用
    前面使用const 表示返回值为const;
    后面加 const表示函数不可以修改class的成员;
    const成员函数可以被非const对象和const对象调用;
    非const成员函数只能被非const对象调用;
  3. 类外补充函数的定义要加作用域限定符::

二、重要知识:cmake
在QT中选择cmake方式构建c++项目,最好提前了解cmake相关知识,以方便理解如何导入外部库,推荐学习视频链接:B站:爱编程的大丙
重要细节:静态库的链接要放在add_executable之前

三、c++代码调用python步骤

  1. 设置python配置
    CMakeList.txt文件中输入python文件的相关信息:头文件夹路径、库文件夹路径、需要连接的库文件名称(有没有.lib后缀都可)
include_directories(C:/programming/anaconda3/envs/pytorch/include)
link_directories(C:/programming/anaconda3/envs/pytorch/libs)
link_libraries(python3)
link_libraries(python38)

在这里插入图片描述
2. c++代码(.cpp)中调用python前初始化

#include "My_Functions.h"
#include <QDir>
#include <Python.h>My_Functions::My_Functions(QObject *parent) : QObject(parent){}
My_Functions:: ~My_Functions(){}bool My_Functions :: directoryExisted(QString dirPath){QDir dir(dirPath);return dir.exists();
}bool My_Functions :: fileExisted(QString filePath){QFile file(filePath);return file.exists();
}
bool My_Functions :: createDirectory(QString dirPath){QDir dir;return dir.mkpath(dirPath);
}
bool My_Functions :: invokePython(){QDir dir;const char* pythonFilePath = (dir.currentPath().append("/").append(dir.currentPath().split("/").last().split("-")[1])).toUtf8();Py_SetPythonHome(L"C:/programming/anaconda3/envs/pytorch");//调用前必须初始化python解释器Py_Initialize();if(!Py_IsInitialized()){qDebug()<<"初始化失败"; return 0;}// 将路径转换为Python对象PyObject *py_path_str = PyUnicode_FromWideChar(Py_DecodeLocale(pythonFilePath, NULL), -1);// 加载 python 脚本// 获取sys模块以进行项目.py文件的搜索PyObject *sys_module = PyImport_ImportModule("sys");// 获取sys.pathPyObject *sys_path = PyObject_GetAttrString(sys_module, "path");if (!PyList_Check(sys_path)) {// sys.path不是列表,错误处理qDebug()<<"获取py搜索路径失败" ;// 释放python所用内存Py_Finalize();return 0;} else {// 将自定义路径添加到sys.pathint appended = PyList_Append(sys_path, py_path_str);if (appended == -1) {// 错误处理qDebug()<<"添加py搜索路径失败" ;// 释放python所用内存Py_Finalize();return 0;}}PyObject *pModule = PyImport_ImportModule("onnxUse");if (pModule == NULL) {// 模块导入失败,处理错误qDebug() << "脚本加载失败";// 释放python所用内存Py_Finalize();return 0;} else {qDebug() << "脚本加载成功";}// 创建函数指针PyObject* pFunc = PyObject_GetAttrString(pModule, "detect_images");  // 方法名称if (pFunc == NULL) {// 函数导入失败,处理错误qDebug() << "函数创建失败";// 释放python所用内存Py_Finalize();return 0;}else {qDebug() << "函数创建成功";}// 调用有参函数// 创建函数参数// s 将C字符串转换成Python对象,如果C字符串为空,返回NONE// z: 类似于 s,但允许转换为 NULL(Python 的 None)// c 将C类型的char转换成长度为1的Python字符串对象// b: C unsigned char,将布尔值转换为 0 或 1// i 将一个C类型的int转换成Python int对象// k: C unsigned long,转换为无符号长整数// l 将C类型的long转换成Pyhon中的int对象// f 将C类型的float转换成python中的浮点型对象// d 将C类型的double转换成python中的浮点型对象// O 通用对象引用,接收任意 Python 对象而不转换// O!: 类型对象和转换标志,用于接收特定类型的 Python 对象// O&: 自定义回调函数,用于自定义对象转换// (ii):两个 C 整型变量构成的元组或列表// [ii]:两个 C 整型变量构成的列表// {ss}:键值对都是 C 字符串的字典// #:s, #i, #d 等:带有长度指示的字符串、整数或浮点数// n: 接收 None,检查参数是否为 None// PyObject* args = Py_BuildValue("(i,s)", 110, "hello");  // 参数为整数 110 和字符串 "hello"// PyObject *result  = PyObject_CallObject(pFunc, args);// 调用无参函数PyObject *result  = PyObject_CallObject(pFunc, NULL);// 检查并处理有参函数调用的返回结果if (result  == NULL) {// 处理错误qDebug() << "函数调用失败";// 释放python所用内存Py_Finalize();return 0;} else {// 使用返回值qDebug() << "函数调用成功";// const char *result_str;// if (!PyArg_Parse(result, "s", &result_str)) {//     // 错误处理:无法将Python对象转换为字符串//     qDebug() << "函数返回值处理失败";//     // 释放python所用内存//     Py_Finalize();//     return 0;// } else {//     // 使用result_str// }}// 释放引用计数Py_DECREF(result);// // 释放参数元组// Py_DECREF(args);// 释放函数指针Py_DECREF(pFunc);// 不再需要模块时,减少引用计数Py_DECREF(pModule);// 释放python所用内存Py_Finalize();qDebug()<<"调用完成";return false;
}

未完待续

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

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

相关文章

使用Docker搭建YesPlayMusic网易云音乐播放器并发布至公网访问

目录 ⛳️推荐 1. 安装Docker 2. 本地安装部署YesPlayMusic 3. 部署公有云YesPlayMusic播放器 3.1 安装cpolar内网穿透 3.2 固定YesPlayMusic公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一…

【区间、栈】算法例题

目录 六、区间 48. 汇总区间 ① 49. 合并区间 ② 50. 插入区间 ② 51. 用最少数量的箭引爆气球 ② 七、栈 52. 有效的括号 ① 53. 简化路径 ② 54. 最小栈 ② 55. 逆波兰表达式求值 ② √- 56. 基本计算器 ③ 六、区间 48. 汇总区间 ① 给定一个 无重复元素 的 …

C# WPF编程-XAML

C# WPF编程-XAML XAML简述XAML子集XAML编译XAML基础XAML名称空间XAML中的属性和事件属性事件使用其他名称空间中的类型 加载和编译XAML XAML简述 XAML(Extensible Application Markup Language的简写&#xff0c;发音"zammel")是用于实例化.NET对象的标记语言。XAML…

LeetCode # 199. 二叉树的右视图

199. 二叉树的右视图 题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3…

大规模电商平台数据采集难点分析♫

▁▃▅▇主要包括以下几方面&#xff1a; API工具 ◆◆数据量巨大 任何系统&#xff0c;在不同的数据量面前&#xff0c;需要的技术难度都是完全不同的。 如果单纯是将数据采到&#xff0c;可能还比较好完成&#xff0c;但采集之后还需要处理&#xff0c;因为必须考虑数据的规…

如何根据业务需求选择合适的电子合同平台?

在数字化转型的浪潮中&#xff0c;电子合同已经成为企业运营中不可或缺的一部分。然而&#xff0c;面对市场上众多的电子合同平台&#xff0c;企业如何根据自身的业务需求做出合适的选择呢&#xff1f;本文将为您一一解答。 在电子合同的签署过程中&#xff0c;数字证书颁发机…

JavaScript 实现通过 id 数组获取可展示的 name 拼接字符串

JavaScript 实现通过 id 数组获取可展示的 name 拼接字符串 场景 有一个包含许多对象的数组&#xff0c;每个对象都包含了一个标识&#xff08;id&#xff09;和一个名称&#xff08;name&#xff09;。想要从这个数组中选出特定的一些对象&#xff0c;这些对象的标识&#x…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(日历选择器弹窗)

点击日期弹出日历选择器弹窗&#xff0c;可选择弹窗内任意日期。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文&#xff0c;不可在UI上下文不明确的地方使用&…

nodejs 常用命令

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;常用于服务器端编程。以下是一些 Node.js 的常用命令 1、安装 Node.js&#xff1a; 通常&#xff0c;你会从 Node.js 的官方网站下载并安装适合你操作系统的版本。安装完成后&#xff0c;你可以在命令行中…

蓝桥--矩阵翻硬币--二分枚举

问题描述 小明先把硬币摆成了一个 n 行 m列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q操作。 对第x行第y列的硬币进行Q操作的定义&#xff1a;将所有第 ix行&#xff0c;第 jy列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xff0c;行号和列号都是从…

python脚本过滤得到non-overlap的utr

使用该脚本对上述的结果"lin_20240321_calculating_rG4score.R"进行过滤 import csvdef read_file(file_path):with open(file_path, r) as file:reader csv.DictReader(file, delimiter\t)return list(reader)def process_sequences(data):gene_sequences {}for …

跨域以及跨域配置

1、什么跨域 首先&#xff0c;在前后端没有分离项目&#xff0c;例如jsp、php&#xff0c;前后台代码没有实现物理上的分离。不存在跨域问题。前后端分离后&#xff0c;前后端的地址域名不同&#xff0c;而同源策略导致浏览器会拦截a地址访问b地址请求&#xff08;a地址通过浏览…

云虚拟主机有哪些作用?

云虚拟主机是一款虚拟主机产品&#xff0c;云虚拟主机是由云计算与虚拟主机共同产生的&#xff0c;接下来小编就带领大家一起来了解一下云虚拟主机都有哪些作用吧&#xff01; 云虚拟主机能够通过在多个服务器上分散虚拟机实例&#xff0c;来提高服务器的可用性和冗余备份&…

39.组合总和40组合总和2

39.组合总和 思路 还是按照组合回溯的思想来解&#xff0c;与原先组合区别就是集合内的元素可重复使用&#xff0c;刚开始考虑原先回溯中startIndex是为了避免重复&#xff0c;那么只需每层递归for循环都完全遍历集合中的元素即可。 但结果出现了排列不同的结果&#xff0c;…

【前端】Web Audio API接口介绍

简言 记录下Web Audio API接口的介绍。 Web Audio API 提供了在 Web 上控制音频的一个非常有效通用的系统&#xff0c;允许开发者来自选音频源&#xff0c;对音频添加特效&#xff0c;使音频可视化&#xff0c;添加空间效果&#xff08;如平移&#xff09;&#xff0c;等等。 …

tomcat安装及配置教程

在安装和配置Tomcat之前&#xff0c;请确保已经安装了Java Development Kit (JDK)。以下是安装和配置Tomcat的步骤&#xff1a; 下载Tomcat。访问Tomcat官方网站&#xff0c;选择适合您需求的版本&#xff08;例如Tomcat 8或9&#xff09;&#xff0c;下载并解压到您的计…

Obsidian插件PicGo-图床创建使用[腾讯云保姆级教程]

一、下载PicGo并配置 1&#xff1a;安装插件 首先插件市场搜索picgo会出现Image auto upload&#xff0c;这个就是PicGo安装此插件并启用即可 2&#xff1a;安装PicGo软件 打开此链接&#xff1a;https://github.com/Molunerfinn/PicGo 自己选择一个方式下载&#xff0c;我…

javascript高级-数组的方法

javascript高级-数组的使用方法 改变原数组返回一个新数组或不改变原数组的等应用场景,如下这些方法在实际项目中通常会用上 getArrlen() {//1.改变原数组的方法let arr [1, 2, 3];arr.push(6); //给数组最后面的添加元素console.log(push, arr); //[1,2,3,6]arr.pop(); //删…

数字乡村发展策略:科技引领农村实现跨越式发展

随着信息技术的迅猛发展和数字经济的崛起&#xff0c;数字乡村发展策略已经成为引领农村实现跨越式发展的重要手段。科技的力量正在深刻改变着传统农业的生产方式、农村的社会结构以及农民的生活方式&#xff0c;为农村经济发展注入了新的活力和动力。本文将从数字乡村的内涵、…

第十四届蓝桥杯JavaB组省赛真题 - 幸运数字

进制转换可以参考如下的十进制&#xff0c;基本一样的&#xff0c;只是把10变成了其他数字&#xff0c; sum就是各个数位之和 public static int myUtil(int n) {int sum 0;while(n > 0) {sum n % 10;n / 10;}return sum;} 注意&#xff1a; 如果写在同一个类里面&…