当前位置:   article > 正文

qt5(C++)调用python_qt c++ 调用 python

qt c++ 调用 python

一、环境准备

进行调用前需要安装好QT以及Python。

Win10 64位系统
python3.6 64位
Qt5.14.1
  • 1
  • 2
  • 3

①、创建一个QT项目
新建一个即可
在这里插入图片描述
②、配置.pro文件

右键->添加库
在这里插入图片描述
外部库

选择python38.lib文件路径
我使用的是Anaconda里面的Python,路径如下:

D:\Users\Administrator\Anaconda3\libs\python38.lib
  • 1

在这里插入图片描述
在这里插入图片描述
如下图取消多余的选项
在这里插入图片描述

点击完成后会生成如下图绿框的内容,删除橘黄色框的内容。
在这里插入图片描述
修改object.h头文件内容
我的路径在:

D:\Users\Administrator\Anaconda3\include
  • 1


在1如图位置加入#undef slots
#define slots Q_SLOTS
在这里插入图片描述
编译运行以下,不报错则代表配置完成了。

二、测试

上一步编译运行完后会生成build-MainGUI-Desktop_Qt_5_14_1_MinGW_64_bit-Debug文件夹,进入这个文件夹下创建一个python文件。
在这里插入图片描述
写入测试代码:

def hello(a,b):
    return a+b
  • 1
  • 2

测试代码如下:
maingui.h文件内容如下:

#ifndef MAINGUI_H
#define MAINGUI_H
#include "C:\Users\Administrator\AppData\Local\Programs\Python\Python37\include\Python.h"
#include <iostream>
#include <QDebug>
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainGUI; }
QT_END_NAMESPACE

class MainGUI : public QMainWindow
{
    Q_OBJECT

public:
    MainGUI(QWidget *parent = nullptr);
    ~MainGUI();

private:
    Ui::MainGUI *ui;
};
#endif // MAINGUI_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

maingui.cpp文件内容如下:

#include "maingui.h"
#include "ui_maingui.h"

MainGUI::MainGUI(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainGUI)
{
        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("hello");
        if (!pModule)
            qDebug()<<"获取模块指针失败";
        //创建函数指针
        PyObject* pFunc= PyObject_GetAttrString(pModule,"hello");
        if(!pFunc)
            qDebug()<<"获取函数指针失败";
        //创建函数参数,方法1
        PyObject* pPara = PyTuple_New(2);        // 2个参数
        PyTuple_SetItem(pPara, 0, Py_BuildValue("i",7));  //参数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!"
        */
        //创建函数参数,方法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();
}
MainGUI::~MainGUI()
{
    delete ui;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

编译运行,得到如下结构则代表调用成功了。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/100652
推荐阅读
相关标签
  

闽ICP备14008679号