1、创建Qt工程
2、添加Python文件
本文福利,
莬
费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击
莬
费领取↓↓
编写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开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击
莬
费领取↓↓