Qt调用Python详细图文过程记录

 更新时间:2023年05月12日 09:58:07   作者:十年编程老舅  
Qt调用python实际上就是c++调python,网上搜会出来很多,介绍得也比较全,这里做个记录,下面这篇文章主要给大家介绍了关于Qt调用Python详细图文过程,文中通过图文介绍的非常详细,需要的朋友可以参考下

1、创建Qt工程

2、添加Python文件

编写Python代码,项目结构如下图示:

3 、添加Python库

在工程文件中加上Python安装路径下的​​include​​​和​​libs​​路径:

INCLUDEPATH += C:\Users\Administrator\AppData\Local\Programs\Python\Python37\include
LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python37\libs -lpython37
//注意:-L 和 PATH 之间不能有空格

注意:此处必须根据自己的安装情况做修改

4、调用Python模块

#ifndef
#define
 
#include <QMainWindow>
#include <Python.h>
#include <iostream>
#include <QDebug>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
};
#endif// MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    //Python初始化
    Py_Initialize();
    if( !Py_IsInitialized() )
        qDebug()<<"初始化失败";
 
    //导入sys模块设置模块地址
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    //QString setSysPath = QString("sys.path.append('%1')").arg(QCoreApplication::applicationDirPath());
    //PyRun_SimpleString(setSysPath.toStdString().c_str());
 
    //创建模块指针
    PyObject* pModule = PyImport_ImportModule("Py_Module");
    if (!pModule)
        qDebug()<<"获取模块指针失败";
 
    //创建函数指针
    PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
    if(!pFunc)
        qDebug()<<"获取函数指针失败";
 
    //创建函数参数,方法1
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("i",1));  //参数1为int型 1
    PyTuple_SetItem(pPara, 1, Py_BuildValue("i",2));  //参数2为int型 2
    //pPara = Py_BuildValue("(i,i)",1,2); //连写方式
 
    /*
    PyObject* pPara = PyTuple_New(2);        // 2个参数
    PyTuple_SetItem(pPara, 0, Py_BuildValue("s","Hello"));  //参数1为String型 "Hello"
    PyTuple_SetItem(pPara, 1, Py_BuildValue("s","World!"));  //参数2为String型 "World!"
    */
    
    /// s 将C字符串转换成Python对象,如果C字符串为空,返回NONE
    /// c 将C类型的char转换成长度为1的Python字符串对象
    /// i 将一个C类型的int转换成Python int对象
    /// l 将C类型的long转换成Pyhon中的int对象
    /// f 将C类型的float转换成python中的浮点型对象
    /// d 将C类型的double转换成python中的浮点型对象
 
    //创建函数参数,方法2
    PyObject* args = PyTuple_New(2);        // 2个参数
    PyObject* arg1 = PyLong_FromLong(4);    // 参数一设为4
    PyObject* arg2 = PyLong_FromLong(3);    // 参数二设为3
    PyTuple_SetItem(args, 0, arg1);
    PyTuple_SetItem(args, 1, arg2);
 
    //调用Python函数,传入元组参数pPara
    PyObject *FuncBack = PyObject_CallObject(pFunc,pPara);
    //PyObject_CallObject(pFunc,nullptr); //无参数调用
 
    //FuncBack是返回值指针,转换获取返回值
    int res = 0;
    PyArg_Parse(FuncBack,"i",&res);
    qDebug()<<"返回值: "<<res;
 
    //调用结束,销毁
    Py_Finalize();
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

5、移动文件

编写完上述代码之后,直接运行,会得到:

获取模块指针失败

要保证Qt可执行文件与Python源文件在同一级目录下,方可正常运行

所以将工程下的​​Py_Module.py​​​复制到构建目录下的​​debug​​文件夹中:

6、运行结果

7、错误总结及解决办法

错误1:找不到​​Python.h​​

出现原因: 因为我们在c++中使用这个了头文件,因此出现了找不到python.h
解决办法: 在.pro文件中添加python的头文件以及静态链接库,参考:3 、添加Python库

错误2:

PyType_Slot *slots; object.h(445) : error C2059: 语法错误:“;”
object.h(445) : error C2238: 意外的标记位于“;”之前

解决办法:把slots改成slots1,Python将slots作为变量,而Qt将slots作为关键字,所以冲突了,再次编译该问题就没有了

错误3:

解决办法:简单粗暴,直接注释掉

总结

到此这篇关于Qt调用Python的文章就介绍到这了,更多相关Qt调用Python内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用python实现正则匹配检索远端FTP目录下的文件

    使用python实现正则匹配检索远端FTP目录下的文件

    这篇文章主要介绍了使用python实现正则匹配检索远端FTP目录下的文件的方法,非常的简单实用,需要的小伙伴参考下
    2015-03-03
  • pytorch中的dataset用法详解

    pytorch中的dataset用法详解

    这篇文章主要介绍了pytorch的dataset用法详解,当我们继承了一个 Dataset类之后,我们需要重写 len 方法,该方法提供了dataset的大小; getitem 方法, 该方法支持从 0 到 len(self)的索引,下面来看看附有代码的讲解吧,希望对你的学习或者工作有所帮助
    2022-01-01
  • Python利用psutil库进行监控进程和资源

    Python利用psutil库进行监控进程和资源

    psutil是Python系统和进程工具库,它提供了一种跨平台的方式来获取系统信息、管理系统进程、监控系统性能、操作系统资源等,下面就跟随小编一起来学习psutil库的具体应用吧
    2024-01-01
  • Windows和夜神模拟器上抓包程序mitmproxy的安装使用详解

    Windows和夜神模拟器上抓包程序mitmproxy的安装使用详解

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作,这篇文章主要介绍了Windows和夜神模拟器上抓包程序mitmproxy的安装使用详解,需要的朋友可以参考下
    2022-10-10
  • python 实现将多条曲线画在一幅图上的方法

    python 实现将多条曲线画在一幅图上的方法

    今天小编就为大家分享一篇python 实现将多条曲线画在一幅图上的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 使用PyInstaller将python转成可执行文件exe笔记

    使用PyInstaller将python转成可执行文件exe笔记

    这篇文章主要介绍了使用PyInstaller将python转成可执行文件exe笔记,需要的朋友可以参考下
    2018-05-05
  • python 类对象的析构释放代码演示

    python 类对象的析构释放代码演示

    这篇文章主要介绍了python 类对象的析构释放代码演示,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Mac下PyCharm快捷键分享

    Mac下PyCharm快捷键分享

    这篇文章主要介绍了Mac下PyCharm快捷键,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 总结网络IO模型与select模型的Python实例讲解

    总结网络IO模型与select模型的Python实例讲解

    同步、异步、阻塞、非阻塞,当这些网络IO名词堆到一起时难免使编程初学者感到困惑,这里我们就来为大家总结网络IO模型与select模型的Python实例讲解:
    2016-06-06
  • python+selenium实现QQ邮箱自动发送功能

    python+selenium实现QQ邮箱自动发送功能

    这篇文章主要为大家详细介绍了python+selenium实现QQ邮箱自动发送功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论