Qt链接anaconda动态库
1.创建Qt项目
1.1双击打开Qt Creator
1.2点击新建项目
1.3(如图)
注意:一定要选择64位的!!!!!!
1.4项目创建成功!
2.添加anaconda库
2.1右键点击项目名,选择添加库(add library)
2.2选择添加外部库
因为anaconda是外部库,所以选择添加外部库
2.3选择库的路径
2.3.1选择库文件路径
所谓库文件(Library file),就是anaconda安装位置的libs文件夹下的.lib文件
此时要注意的是,当库文件路径选择好后,会自动生成包含路径,但是正确的包含路径并不是它给出的这条路径,因此,我们必须重新选择包含路径,而不是使用它自动产生的。
2.3.2选择包含路径
这样就正确了,然后再取消一些选项
2.3.3点击下一步
最终,生成如下代码:
win32:CONFIG(release, debug|release): LIBS += -LD:/installQudong/anaconda2/libs/ -lpython39
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/installQudong/anaconda2/libs/ -lpython39d
INCLUDEPATH += D:/installQudong/anaconda2/include
DEPENDPATH += D:/installQudong/anaconda2/include
到这一步,conda库已经添加完成
2.4运行该项目
选择release,64位,运行(一定要这么选,否则运行失败!!!)
运行成功!
3.测试
3.1在widget.h中额外添加头文件
#include <QDebug>
#undef slots
#include <Python.h>
#define slots Q_SLOTS
using namespace std;
3.2在widget.cpp文件
在该文件的构造函数中添加如下代码:
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置环境变量
Py_SetPythonHome(L"D:\\installQudong\\anaconda2");
//Python初始化
Py_Initialize();
if( !Py_IsInitialized() )
qDebug()<<"初始化失败";
//导入sys模块设置模块地址
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//创建模块指针
PyObject* pModule = PyImport_ImportModule("Py_Module");
if (!pModule)
qDebug()<<"获取模块指针失败";
//创建函数指针
PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
if(!pFunc)
qDebug()<<"获取函数指针失败";
//创建函数参数
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,args);
//PyObject_CallObject(pFunc,nullptr); //无参数调用
//FuncBack是返回值指针,转换获取返回值
int res = 0;
PyArg_Parse(FuncBack,"i",&res);
qDebug()<<"返回值: "<<res;
//调用结束,销毁
Py_Finalize();
}
3.3在工程文件下新建.py文件
文件的内容如下:
def add(a, b):
return a + b
3.4将新建的.py文件复制
粘贴到节2.4中,运行项目时生成的文件夹中的release文件夹下
3.5再次运行该项目
返回正确的结果,运行成功!
3.4将新建的.py文件复制
粘贴到节2.4中,运行项目时生成的文件夹中的release文件夹下
3.5再次运行该项目
返回正确的结果,运行成功!