如果对你有帮助,可以给卑微的博主留个赞、关注、收藏 (不是)
除了qt自带的官方库文件,有时可能想用到一些第三方的库文件,或者调用python等行为,所以需要引入外部库,道理很简单,实现起来也不难,不过有一些要注意的小问题。
本文章使用的环境 qt 5.12.6 python3.7 64bit opencv 3.4.14
一:qt调python脚本
创建一个qwidgets应用,不多说,该怎么创建都懂的
接下来要引入外部库
自然选择外部库然后接下来要注意了
python的库是动态库,你需要找到自己的python存储目录,要引入的库文件名字是libpythonXX.a
(XX是版本,我的python3.7就是37) ,找到后确认,接下去是包含路径,当你选择库文件后会生成包含路径,但是默认的路径是错的,需要手动改。
在我们刚才选的库文件的上一级目录里面有个include文件夹,这才是正确的路径
最后选完就是这样子,我们把为debug版本添加后缀去掉,我装的python好像没有debug版本的,所以不选,选了应该也没什么关系,然后点下一步,再点完成就添加完毕了
添加完之后会多出几行代码
到此我们添加库成功
测试一下
在需要使用python的cpp文件中 引入py头文件 ,(Python.h)
注意:这里由于命名冲突需要先取消qt本来的定义,再引入头文件,最后恢复qt原本的定义
#测试用的py代码 py_demo.py
def show():
print("hello!")
//main.cpp
#include "mainwindow.h"
#include<QDebug>
#include <QApplication>
#undef slots
#include <Python.h>
#define slots
int main(int argc, char *argv[])
{
Py_Initialize(); //初始化python
if(!Py_IsInitialized()) //如果初始化失败
{
qDebug()<<"Python init fail!";
return -1;
}
//加载模块,模块名称为py_demo (py_demo.py)
PyObject *pModule = PyImport_ImportModule("py_demo");
if(!pModule) //加载失败
{
qDebug()<<"load pModule fail!";
return -1;
}
PyObject* show = PyObject_GetAttrString(pModule, "show"); //加载show函数
if(!show) //加载函数失败
{
qDebug() << "load func show fail";
}
//PyEval_CallObject(show,NULL); //调用函数show 旧式写法
PyObject_CallFunction(show,nullptr,nullptr); //新写法
Py_Finalize(); //退出
return 0;
}
注意:py_demo.py需要放在输出目录(qt先编译后才有输出目录)
例如我的目录如下
那py文件放在这里(输出目录的debug里面,如果使用release 就是release里面)
结果:
二:qt使用opencv
先创建工程,纯c++就行,应该没有不会的吧
之后还有一个问题,opencv我们下载的编译好的版本适用于vs的编译链,而qt编译有msvc和mingw两种,使用mingw的话我们需要手动编译opencv的源码
这里需要的可以参考这个视频,b站贾志刚老师的视频,当初也是拿这个教程配的环境,但是我qt版本比较低,opencv4编译没成功,qt5.12最多支持opencv3,如果使用的版本比较高可以直接看视频,比较低就只看视频的编译源码部分
考虑到官网opencv下载有点慢,我就顺便把源码和编译好的库上传了,应该没事吧
需要的主页免费自取
下面介绍使用mingw编译链下的opencv
这个是我编译好的库,其他文件是源码和opencv官方编译好的文件,演示只使用自己编译的库
先配一下环境变量
路径是mingw_build/install/x64/mingw/bin
里面文件长这样
然后添加库,和之前一样
接下来选动态库,库文件路径如下
include目录如下
debug版本后缀加d取消勾选,点下一步完成就行了
测试头文件都没有报错,应该就完成了