当前位置: 首页 > 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.执行结果

相关文章:

  • 跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布
  • Bricks WordPress 网站生成器中存在 RCE 漏洞,黑客正在积极利用
  • C++编程知识
  • 专业140+总分420+南京信息工程大学811信号与系统考研经验南信大电子信息与通信工程,真题,大纲,参考书
  • mescroll 在uni-app 运行的下拉刷新和上拉加载的组件
  • 【Visual Studio】技巧 :自动与活动文档同步
  • 计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别
  • 虚拟机器centos7无法识别yum 命令异常处理笔记
  • 普中51单片机学习(七)
  • Autosar-Mcal配置详解-GPT
  • java 课程签到管理系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目
  • IP协议及相关技术协议
  • Git基本指令
  • 如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验
  • Java入门-可重入锁
  • Android优雅地处理按钮重复点击
  • Android组件 - 收藏集 - 掘金
  • Angular 2 DI - IoC DI - 1
  • css的样式优先级
  • CSS相对定位
  • HashMap ConcurrentHashMap
  • JavaScript类型识别
  • Js基础——数据类型之Null和Undefined
  • ng6--错误信息小结(持续更新)
  • nginx 负载服务器优化
  • Promise面试题,控制异步流程
  • python 学习笔记 - Queue Pipes,进程间通讯
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 大型网站性能监测、分析与优化常见问题QA
  • 欢迎参加第二届中国游戏开发者大会
  • 简单数学运算程序(不定期更新)
  • 我感觉这是史上最牛的防sql注入方法类
  • 我有几个粽子,和一个故事
  • 物联网链路协议
  • 说说我为什么看好Spring Cloud Alibaba
  • #include到底该写在哪
  • #微信小程序(布局、渲染层基础知识)
  • (003)SlickEdit Unity的补全
  • (C语言)共用体union的用法举例
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .apk文件,IIS不支持下载解决
  • .NET : 在VS2008中计算代码度量值
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET企业级应用架构设计系列之开场白
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [20150904]exp slow.txt
  • [C#]winform部署PaddleOCRV3推理模型