安装Qt6
- 从官网下载qt,这里直接甩一个连接
qt6 官方下载地址https://www.qt.io/download-qt-installer-oss?hsCtaTracking=99d9dd4f-5681-48d2-b096-470725510d34%7C074ddad0-fdef-4e53-8aa8-5e8a876d6ab4
剩下的就是正常的安装了,都是傻瓜式安装,倒也没有什么好说的,这里需要注意的一点就是,如果是在windows环境下使用qt,编译器最好选择msvc,这样的话,对于后面安装编译安装opencv也更方便
最开始接触到opencv时,是使用的msvc,但是qt中用的是MinGW 编译的时候各种报错,排查问题花了好久,这个后面再说
- 创建一个项目验证一下QT基础安装
不同系统下创建略有不同,其实不必在意,具体等实操时自会体现。
这里推荐使用qmake,后期的各种环境依赖更好调整,其实各个方法差别不大有兴趣可以研究一下剩下两个部分
注意: 这里选择的套件是msvc2019 因为使用的是qt6 要求支持c++17 msvc17 是没办法全面支持的,因此,选择更低版本可能会导致项目编译报错
点击完成就行了
创建好以后就可以看到这个界面了,其实这里多了一个opencv的目录结构,暂时先不用关注,我这是在pro文件中包含了这个东西。
点击执行就行了,这里应该会看到能直接跳出来一个空白界面,我这里增加了一个lable。不重要
在qt的编译过程中应该不会有什么别的问题,相对来讲还是比较简单的。
opencv 库编译
opencv库的编译是依赖于cmake环境的,当然,在linux环境下安装cmake 然后增加各种cmeke编译选项会很方便,但是这里为了简化上手难度,主要是用macos或者windows环境下的CMakeUI进行编译,
- 首先在cmake官网下载cmakeui。
https://cmake.org/download/
我这里使用Windows环境,主要是受众比较多,Mac跟windows使用区别不大。
这是打开了CMake UI的界面,我这里是直接把opencv的库添加进去了,暂时忽略
- 好了,现在开始下载opencv。这里如果去opencv官网下载的话,看之前的资料 官网是给了一套编译好的代码的,并且现在官网也给提供了一个exe文件,我下载了,点击安装之后发现内容不全,不方便后续使用,建议直接编译,直接从github库里下载代码就行了,官网也是直接甩的github连接。
https://github.com/opencv/opencv/releases
下载之后直接解压出来就行了。我这里还创建了一个build文件,后续构建的目录就放在这里。
还是回到这里
点击configure 会让你选择一个构建器,这里选择msvc
点击finish之后会有一些告警信息,暂时先不用关心 等待编译结束
第一次构建结束之后就可以看到下面这个界面了
这里需要说明的是,现在最好选中 opencv_world. 这个东西就是为了将opencv打包成一个库使用,
选中之后再次点击 configure, 然后点击generate就行了
这时候你会在 刚刚创建的build目录下面看到这个文件
熟悉vs的同学应该很清楚,这是vs的工程文件,点击打开
选中生成。批生成,选中 INSTALL , ALL_BUILD。
然后你就需要等待,这样一个可以在windows环境下使用的 opencv库就能使用了
这时候创建一个文件, 文件后缀叫做.pri 这个文件就作为qt项目的外部依赖配置文件使用了,还记得前面要求使用qmake 去创建qt项目吗 就是为了这里能够更加方便的增加这个外部库,CMake虽然也能,但没有那么方便,具体pri文件怎么写, 后面章节说明。
QT 与 opencv
好了,现在我们qt项目已经创建成功了, opencv也编译好了,那么剩下的就是搞一个样例程序了,这里就简单的写写,主要目的是为了让opencv 能够在qt里用起来, 更多细节还得后面学习
- pri文件书写
因为创建的qt项目通过qmak管理,在项目创建之初会创建一个pro文件,这里可以在qt creator中看到,暂时先不用管他具体每一句细节是什么。这里首先说明一下pri文件
pri文件在qmake中类似于设备树插件中的 dts和dtbs文件之间的关系,在pro文件中,增加
include(path) 就可以增加pri文件,
pri文件中,只需要增加includepath, dependpath, LIBS文件,指明文件路径就可以了。下面是我创建项目中的pro文件以及pri文件 样例
pri
INCLUDEPATH += D:/lib/include
DEPENDPATH += D:/lib/include
Debug:{
LIBS += -lD:/lib/x64/vc17/lib/opencv_world4100d
}
Release:{
LIBS += -lD:/lib/x64/vc17/lib/opencv_world4100
}
其实在前面编译好opencv文件之后忘记说明了,在使用vs生成好项目之后,所有的文件会在install文件下面, dll文件会在 x86/vc17/bin目录下, lib文件会在 x86/vc17/lib目录下, 我这里是吧install目录拷贝出来了,免的使用的路径太长了。
这里编写的pri文件都是使用的 ‘/’作为路径分隔符,与windows环境下的常用习惯不一致,因为qt支持跨平台,所以这里所有的路径分隔符都应该使用 ‘/’ 而不是’'。
这里还需要额外说明的是, 在pri文件中,除了includepath字段之外,还应该添加dependpath,不然的话,在编译阶段会找不到头文件,这种情况在linux环境下以及mac环境都没有出现,具体原因我也说不好,我参考的教材中,没有使用dependpath这个配置选项,导致一直报错,就很烦。下面是 AI给出的答案
在 Qt 项目配置中,INCLUDEPATH
和DEPENDPATH
是两个不同的变量,它们的作用和使用场景有所不同。
INCLUDEPATH
INCLUDEPATH
用于指定编译器在编译过程中查找头文件的路径。当你在代码中使用#include
指令包含头文件时,编译器会根据INCLUDEPATH
中指定的路径来查找这些头文件。
例如:
INCLUDEPATH += D:/lib/include
这告诉编译器在D:/lib/include
目录下查找头文件。
DEPENDPATH
DEPENDPATH
用于指定 qmake 在生成 Makefile 时查找依赖文件的路径。虽然DEPENDPATH
和INCLUDEPATH
在某些情况下可以设置为相同的路径,但它们的主要用途不同。DEPENDPATH
主要用于 qmake 在处理依赖关系时查找相关文件。
通常情况下,DEPENDPATH
可以省略,因为 qmake 会自动根据INCLUDEPATH
来处理依赖关系。然而,在某些复杂的项目中,可能需要显式地设置DEPENDPATH
来确保 qmake 能够正确处理依赖关系。
结论:
通常情况下,INCLUDEPATH
是必需的,而DEPENDPATH
可以省略。在大多数情况下,INCLUDEPATH
足以确保编译器和 qmake 正确处理头文件和依赖关系。如果你的项目没有特殊需求,可以只设置INCLUDEPATH
。
pro
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
# 在这里手动添加pri文件就行了
include (D:/lib/opencv.pri)
修改过pro文件之后, 应该就能在项目目录中看到增加了opencv的配置目录,这个是qt creator自动添加的。
写个代码验证一下, 就是在qt创建的默认mian文件里增加了几行代码,作用就是打开一个图片,并且展示出来,
#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
cv::Mat image = cv::imread("D:/QTProject/1.png");
cv::imshow("Output", image);
MainWindow w;
w.show();
return a.exec();
}
我在最开始创建好项目的时候,直接执行也是可以执行的,后来不知道为什么,突然就不能访问 appData 目录了,现在找不到对应的截图了,如果遇到temp main.odj 无法写入的情况,可以调整环境变量中的temp与tmp文件目录,即可解决。
补充说明一下关于MinGW与MSVC的问题,这里使用 MSVC 的主要原因是,使用MinGW编译qt的话,MSVC编译的OPENCV库就不能使用了,老是报错连接不到动态库,但是,使用MinGW编译OPENCV会非常非常麻烦,我花了两天时间也没搞定,各种环境依赖需要去解决,所以非常不建议折腾,Mac与linux 就用 Unix Makefiles就行了