1.前言
QGIS作为一款开源的桌面GIS软件,其易用性、稳定性和可扩展性受到越来越多的技术人员和学者的好评与支持,并且基于社区的开发模式使QGIS的研发和迭代非常迅速。目前,QGIS已经具有完整且稳定的桌面GIS功能,并且逐渐地在移动GIS、web GIS等方向进行扩展,可以与众多开源GIS软件和模块相互支持,形成工具链,并构成功能全面的GIS软件体系,在开源GIS中具有独特且完整的应用前景。
本博文通过QGIS开源库实现一个GIS工程,通过本工程,可以学习如何利用QGIS库建立自己的GIS工程。QGIS通过源码编译安装和非源码安装,请参考:
2.开发环境简述
开发环境如下:
- Windows 10 教育版 21H1 19043.928。
- Qt 5.14.1。
- QGIS 3.26.2。
- Visual Studio 2019 版本16.4.5 。
- CMake 3.23.0。
3.启动VS,创建Qt工程
启动VS后,新建项目,搜索Qt,找到QtWidgetsApplication后进行创建新项目,我这里直接用默认名称QtWidgetsApplication1。
注意,在导入模块的时候要把XML勾选上,否则运行的时候会报错。如果这里不勾选,也可以创建好后,在VS中的扩展->QT VS Tools -> QT project settings ->Qt Modules中进行添加(下图)。
接着修改项目文件:
main.cpp
#include "QtWidgetsApplication1.h"
#include <QtWidgets/QApplication>
#include <qgsapplication.h>
int main(int argc, char *argv[])
{
QgsApplication a(argc, argv, true);
QgsApplication::setPrefixPath("F:/OSGeo4WQGIS/apps/qgis", true);
QgsApplication::initQgis(); //初始化QGIS应用
QtWidgetsApplication1 w; //创建一个窗体,类似于Qt
w.show();
return a.exec();
}
QtWidgetsApplication1.h
#pragma once
#include "ui_QtWidgetsApplication1.h"
#include <QtWidgets/QMainWindow>
#include <qmenu.h>
#include <qaction.h>
#include <qgsmapcanvas.h>
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = Q_NULLPTR);
private:
Ui::QtWidgetsApplication1Class ui;
// create the menus and then add the actions to them.
QMenu* fileMenu;
QAction* openFileAction;
//map canvas
QgsMapCanvas* mapCanvas;
QList<QgsMapLayer*> layers;
public slots:
void on_openFileAction_triggered();
public:
void addVectorLayer();
};
QtWidgetsApplication1.cpp
#include "QtWidgetsApplication1.h"
#include <qmenubar.h>
#include <qmessagebox.h>
#include <qfiledialog.h>
#include <qgsvectorlayer.h>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
: QMainWindow(parent)
{
this->resize(600, 400);
// create the menus and then add the actions to them.
fileMenu = this->menuBar()->addMenu("File");
openFileAction = new QAction("Open", this);
this->connect(openFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openFileAction_triggered()));
fileMenu->addAction(openFileAction);
// initialize the map canvas
mapCanvas = new QgsMapCanvas();
this->setCentralWidget(mapCanvas);
mapCanvas->setCanvasColor(QColor(255, 255, 255));
mapCanvas->setVisible(true);
mapCanvas->enableAntiAliasing(true);
}
void QtWidgetsApplication1::on_openFileAction_triggered()
{
addVectorLayer();
}
void QtWidgetsApplication1::addVectorLayer()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
QStringList temp = fileName.split('/');
QString basename = temp.at(temp.size() - 1);
QgsVectorLayer* vecLayer = new QgsVectorLayer(fileName, basename, "ogr");
if (!vecLayer->isValid())
{
QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
return;
}
mapCanvas->setExtent(vecLayer->extent());
layers.append(vecLayer);
mapCanvas->setLayers(layers);
mapCanvas->refresh();
}
4
. 配置项目属性
在
C++ ->常规 -> 附加包含目录
中添加以下项
C:\OSGeo4W\include
C:\OSGeo4W\apps\qgis\include
在
链接器 ->常规 -> 附加库目录
中添加以下项:
C:\OSGeo4W\apps\qgis\lib
其中上述目录、库路径为
Win10下通过源码编译安装QGIS
博文编译安装之后生成的路径,请参见该博文并根据自己本机实际路径更改。
在“
链接器” ->”输入” -> “附加依赖项
”中添加以下项:
qgis_app.lib
qgis_core.lib
qgis_gui.lib
如果遇到编译错误,请参考《
VS2019+QT5.15.2+QGIS二次开发环境搭建(非源码方式)
》博文解决。搜索C:\OSGeo4W目录下的所有的dll及plugins目录将其放到程序同一个目录下,启动,
从
https://grass.osgeo.org/download/sample-data/
下载GIS测试样本数据。如下是选择rivers.shp后展示的河流release版本的运行效果:
注意:可以将一些不必要的dll删除,如:在release版本下可以删除debug版的Qt相关的dll。
在实际开发时,强烈建议用release版本的库开发,不要用debug,具体原因参见
《
Win10下通过源码编译安装QGIS
》博文。
5.启动工程及错误解决
从
https://grass.osgeo.org/download/sample-data/
下载GIS测试样本数据。启动debug版程序,选择测试数据,发现奔溃了,编译出的QGIS官方自带的gis.exe也崩溃。原因如下:
Win10下通过源码编译安装QGIS
博文提到的安装即官方提供的库好多是release版本的,即
QGIS-master 3.26.2 源码在debug版本下链接的是Release版本的库导致崩溃,当全部切换到Release版本下,程序不会崩溃,能正常运行。主要涉及到如下库:
- qca-qt5.lib
- Qt5WebKit.lib
- Qt5WebKitWidgets.lib
QGIS-master 3.26.2 源码通过CMake编译(具体参见
Win10下通过源码编译安装QGIS
)生成的VS2019解决方案下的好多工程debug版下链接的是Release版本的库,从而导致奔溃。所以强烈建议:
在实际开发时,强烈建议用release版本的库开发,不要用debug
,如果要设置断点,则按如下方法设置:
以Vs2019为例
打开工程属性页 – 配置选择release – 配置属性
1、C/C++ – 常规 – 调试信息格式
默认配置:空或无
调试配置:程序数据库(/Zi)或(/ZI)
2、C/C++ – 优化 – 优化
默认配置:最大优化(优化速度)(/O2)
调试配置:禁止(/Od)
3、链接器 – 调试 – 生成调试信息
默认配置:否
调试配置:是(/DEBUG)
备注: 若Release下需断点调试则对上面三条配置“调试配置”;而需取消Release断点调试则对上面三条设置”默认配置”即可。当调试好后,给客户版本时,请恢复到默认配置。
6.debug版本调试遇到的各种问题汇总
6.1.debug版的qca-qt5库生成
从
https://download.kde.org/stable/qca/
下载qca-qt5库的源码,注意:版本不能太高。本人通过测试发现,版本太高,如2.3.4, CMake生成VS的解决方案时会报错,不能生成VS解决方案。如下,本人选择的2.1.3版本:
通过CMake生成VS2019的解决方案后,编译出debug和release版本的qca-qt5的lib和dll,分别拷贝或替换OSGeo4W\apps\Qt5\bin\qca-qt5d.dll、OSGeo4W\apps\Qt5\bin\qca-qt5.dll、OSGeo4W\apps\Qt5\lib\qca-qt5d.lib、OSGeo4W\apps\Qt5\lib\qca-qt5.lib。
6.2. Qt5WebKit、Qt5WebKitWidgets库
因为 Qt5WebKit、Qt5WebKitWidgets库在Qt 5.1.0版本之后被剔除了,所以在高版本的Qt,如本人用的是5.14.1,不存在这两个库。解决方法为:从如下Qt官网
下载Qt 5.1.0版本安装到在本机,然后从安装目录下将Qt5WebKitd.dll、Qt5WebKit.dll、Qt5WebKitd.lib、Qt5WebKit.lib、Qt5WebKitWidgetsd.dll、Qt5WebKitWidgets.dll、Qt5WebKitWidgetsd.lib、Qt5WebKitWidgetslib分别拷贝或替换OSGeo4W\apps\Qt5\bin\ OSGeo4W\apps\Qt5\lib\ 对应的该文件。
在Qt 5.1.0安装目录下搜索出icudt51.dll、icuin51.dll、icuuc51.dll,因为打包主程序时要用到这几个dll。
因为Windows下的Qt 5.1.0用到VS 2012中的sdk,所以还需装个VS 2012,Visual Studio 2012 官方简体中文旗舰版下载地址一【官方链接】:
点击这里直接下载
然后从VS2012安装目录下搜索出 msvcp110d.dll、msvcrpd.dll等库,后期打包要用。