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

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.lryc.cn/news/311676.html

相关文章:

  • 计算机网络实验一 网线制作
  • android TextView 实现富文本显示
  • Linux常用命令(超详细)
  • 软考笔记--基于架构的软件开发方法
  • CSS 盒子模型(box model)
  • 基于springboot+vue的在线考试系统
  • 001 概述
  • linux环境下nginx的配置文件
  • AcWing:1236. 递增三元组
  • 关于并网继电器的继电器自检逻辑及实现方式
  • Spring中的事务和事务的传播机制
  • 前端【技术类】资源学习网站整理(那些年的小网站)
  • MySQL——存储引擎
  • YoloV8改进策略:Block改进|MogaNet——高效的多阶门控聚合网络
  • 关于vue3使用prop传动态参数时父子数据不同步更新问题
  • 招投标系统:从线下招标到高效数字化
  • day08_分类品牌管理商品规格管理商品管理
  • 手写分布式配置中心(二)实现分布式配置中心的简单版本
  • 跨境知识分享:什么是动态IP?和静态IP有什么区别?
  • liunx安装jdk、redis、nginx
  • 【C++】STL学习之旅——初识STL,认识string类
  • Java学习笔记002——类的修饰符
  • 华为交换机常见命令总结
  • Android 签名机制
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Scroll容器组件
  • FreeRTOS操作系统学习——FreeRTOS工程创建
  • 6. 使用 Spring Boot进行开发(Developing with Spring Boot)
  • IP地址工具,判断IP是否在指定范围内(支持ipv6)
  • Redis 之六:Redis 的哨兵模式(Sentinel)
  • 总线要点笔记