一、环境准备
进行调用前需要安装好QT以及Python。
Win10 64位系统
python3.6 64位
Qt5.14.1
①、创建一个QT项目
新建一个即可
②、配置.pro文件
右键->添加库
外部库
选择python38.lib文件路径
我使用的是Anaconda里面的Python,路径如下:
D:\Users\Administrator\Anaconda3\libs\python38.lib
如下图取消多余的选项
点击完成后会生成如下图绿框的内容,删除橘黄色框的内容。
修改object.h头文件内容
我的路径在:
D:\Users\Administrator\Anaconda3\include
在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
测试代码如下:
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
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;
}
编译运行,得到如下结构则代表调用成功了。