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中list*n生成多维数组与for循环生成多维数组的区别说明
这篇文章主要介绍了python中list*n生成多维数组与for循环生成多维数组的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-05-05python中requests库session对象的妙用详解
这篇文章主要介绍了python中requests库session对象的妙用详解,具有一定参考价值,需要的朋友可以了解下。2017-10-10
最新评论