Qt调用Python详细过程

该博客介绍了在Qt工程中调用Python模块的详细步骤,包括创建Qt工程、添加Python文件和库、调用Python模块等。同时提到运行时需保证Qt可执行文件与Python源文件在同一级目录。还总结了运行中出现的错误及解决办法,如添加头文件和库、修改关键字冲突等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建Qt工程

在这里插入图片描述


二、添加Python文件

在这里插入图片描述


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

在这里插入图片描述


三 、添加Python库

在工程文件中加上Python安装路径下的includelibs路径:

在这里插入图片描述

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

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

在这里插入图片描述


四、调用Python模块

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#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;
}


五、移动文件

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

获取模块指针失败

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

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

在这里插入图片描述


六、运行结果

在这里插入图片描述


七、错误总结及解决办法

错误1:找不到Python.h

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


错误2

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

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


错误3
在这里插入图片描述

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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值