1. 环境准备
下载 Visual Studio。我用的是 2019 社区版。
下载 OSGeo4W。这是 Windows 环境下(OSGeo for Windows)的一个程序包管理器。我们需要的所有包都通过本工具下载获取。
OSGeo4W 是一个向导式的包管理器。因为软件源位于国外的原因,安装比较慢。好在国内也有武大的镜像可用。在选择镜像地址的步骤添加 http://gwmodel.whu.edu.cn/mirrors/osgeo4w
这个地址就行了。
典型安装会下载许多用不到的库。所以最好选择高级安装,手动选择需要的库:
- 在
Desktop
分类下点选qgis-ltr
:这个是 QGIS 桌面端软件(你甚至都不需要单独去下载 QGIS 发行包,用这个就行了); - 在
Libs
分类下点选qgis-ltr-devel
:这个是 QGIS 的开发库文件; - 在
Libs
分类下点选qt5-devel
:这个是 Qt 的开发库文件。
Edit:经测试,QGIS 并不会自动选择 Qt 作为依赖,需要手动点选。
剩下的 OSGeo4W 会自动帮你选择依赖项。
Commandline_Utilities
分类下是各种命令行工具,包括 Python;Web
分类下主要是 QGIS Server 相关。
开发库下载完毕之后就可以准备建立 C++ 项目了。建立一个 C++ 空项目。我使用的是 VS 2019 社区版。
Edit:
2022 年初,最新长期支持版 3.22发布。议使用最新版本。基于 Qt4 的老旧的 QGIS 2.18 版已停止支持。不建议使用。
2. 设置项目包含目录和库目录
打开新建项目的属性页,在左侧选择“VC++ 目录”。
以下均以长期稳定版
qgis-ltr
为例。
包含目录:
打开项目属性,将下列目录添加到“包含目录”中:
C:\OSGeo4W\apps\qgis-ltr\include
C:\OSGeo4W\apps\Qt5\include\QtWidgets
C:\OSGeo4W\apps\Qt5\include\QtXml
C:\OSGeo4W\apps\Qt5\include\QtGui
C:\OSGeo4W\apps\Qt5\include\QtCore
C:\OSGeo4W\apps\Qt5\include
OSGeo4W 中,所有安装的库都分门别类存放在 apps
文件夹中。C:\OSGeo4W\apps\Qt5\include
下面存放的是 Qt5 的不同模块头文件,按文件夹存放,除了我上面提到的四个基本模块外,可以根据需要添加。
库目录:
将下列目录添加到“库目录”中:
C:\OSGeo4W\apps\qgis-ltr\lib
C:\OSGeo4W\apps\Qt5\lib
3. 设置附加依赖项
在项目属性页中依次选择“链接器”,“输入”,在“附加依赖项”中添加:
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
qgis_core.lib
qgis_gui.lib
4. 设置调试环境
在项目属性页中选择“调试”,设置“环境”的值为:
PATH=C:\OSGeo4W\bin;C:\OSGeo4W\apps\qgis-ltr\bin;C:\OSGeo4W\apps\Qt5\bin
这一步的目的是让程序在调试的过程中,能正确的获取到运行时所需的 DLL 动态库。注意在部署的时候,需要把所有依赖的 DLL 拷贝出来跟程序一起打包发布。
5.复制dll文件
将C:\OSGeo4W\apps\Qt5\plugins文件下的platforms文件夹防止到运行项目的目录下,同时将需要的的dll复制到项目目录下
示例:
#define _USE_MATH_DEFINES
#include <cmath>
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgsmapcanvas.h>
#include <qgsvectorlayer.h>
#include <qgsproject.h>
int main(int argc, char* argv[])
{
// 创建 QgsApplication 实例
QgsApplication app(argc, argv, true);
// 设置并检查数据插件目录
QgsProviderRegistry::instance("C:/OSGeo4W/apps/qgis-ltr/plugins");
// 控制台打印已载入的插件目录
qDebug() << "QGIS data providers loaded:" << QgsProviderRegistry::instance()->providerList() << Qt::endl;
// 设置 GDAL 数据目录环境变量
qputenv("GDAL_DATA", "C:/OSGeo4W/share/gdal");
// 创建 QgsCanvas 画布实例
QgsMapCanvas c;
const QString file_dir = "E:/shapefile/water.shp";
// 从磁盘 .shp 文件创建矢量图层
QgsVectorLayer* pVectorLayer = new QgsVectorLayer(file_dir, "river");
// 确认图层是否创建成功
qDebug() << "Is layer valid:" << pVectorLayer->isValid();
// 将图层添加到画布上
c.setLayers(QList<QgsMapLayer*>() << pVectorLayer);
// 设置画布窗体标题并显示画布
// 画布本身是 QWidget 的子类,因此可以承担 QWidget 的所有操作
c.setWindowTitle("QGIS 二次开发:画布");
c.show();
// 缩放到图层的空间范围
c.zoomToFullExtent();
// 启动 QgsApplication 实例
return app.exec();
}
参考资料:
http://caiyi.tech/post.html?postKey=qgis_dev_1_env_setup