VS2019+QGIS开发库二次开发环境搭建

VS2019+QGIS开发库二次开发环境搭建

总共分为以下步骤:

  • 下载qgis和二次开发库
  • VS2019搭建开发环境
    • 配置VS2019中的Qt插件
    • 配置完Qt版本后对工程属性进行配置
  • 编写测试代码
  • 运行测试代码
    • 拷贝运行程序需要用的动态库文件

1. 开发环境

2. 下载qgis二次开发SDK
打开osgeo4w-setup-x86_64.exe后
1.选择advanced install[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZoNOhLZC-1623908519881)(https://i.loli.net/2021/06/10/lfPEJAr2Rtb4BH1.png)]
2.选择install from Internetenter image description here
3.选择自己的安装路径
4.选择一个下载网站enter image description here
5.选择需要的开发库
enter image description here
首先在上面的搜索栏输入qgis-ltr(qgis长期支持版),搜索结果出来后点击ALL旁边的Default,变成Install。
enter image description here
enter image description here
完成这一步后清除搜索框的内容,再搜索qgis-dev-deps,重复刚才的步骤,将All点击成Install状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bh2HSC3-1623908519899)(https://i.loli.net/2021/06/10/PNYmujHJXnhAG9y.png)]
然后可以一路点击下一步直到安装完成。

3. VS2019搭建开发环境

配置VS2019中的Qt插件

官网下载Qt VS Tools插件。
选择不使用VS自带扩展管理下载插件的原因是现在Qt VS Tools插件的版本太新了,里面没有Qt GUI Application这个模板。在官网下载较低版本就行,这里选择qt-vsaddin-msvc2019-2.4.3.vsix
下载好之后双击打开就能自动安装到VS2019里面。
安装好之后打开VS2019,创建新的Qt GUI Application模板。我起名叫gis_dev。
enter image description here
创建的过程中勾选XML选项,其他默认就好。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJoIkAGP-1623908519903)(https://i.loli.net/2021/06/10/6afNYVKxRjDi9Aq.png)]
创建工程后,首先取消Qt插件的自动更新。
在扩展—>管理扩展—>更改扩展的设置中取消掉自动检查更新的勾选框,不然每次都会给你自动更新。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ELpGzZVR-1623908519906)(https://i.loli.net/2021/06/08/KRtZA8ve31pXUFL.png)]
然后在扩展—>Qt VS Tools—>Qt Options中配置QGis的Qt版本,点击Add添加,路径OSGeoW64\apps\Qt5,起名随便,然后点击OK。
enter image description here

配置完Qt版本后对工程属性进行配置。
对项目工程右键打开属性,C/C++ —>常规,附加包含目录,点击文件夹图标,添加qgis库的头文件目录.
enter image description here
在里面添加下面三个目录,确定。
enter image description here
再在链接器里添加附加库目录。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtLVyBcn-1623908519913)(https://i.loli.net/2021/06/10/Y2iZeSHXRabDfNO.png)]
添加下图一个路径。enter image description here

最后在输入—>附加依赖项添加lib文件。
enter image description hereenter image description here
这样就配置好了二次开发环境。

4. 编写测试代码

参考 基于QGis二次开发创建自定义程序–环境搭建这篇博客的测试代码,对其做出了一点修改。

首先双击,用Qt Designer打开gis_dev.ui,在界面里新添加菜单项,设置变量名为:m_actAddVector,如图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3oAavBel-1623908519920)(https://i.loli.net/2021/06/10/59eRrU4NtJK6uZi.png)]
保存后关闭,然后使用下面的测试代码。

gis_dev.h

#include <QtWidgets/QMainWindow>
#include "ui_gis_dev.h"
#include <QtCore/qnumeric.h>
#define M_PI (3.1415926)
#define M_PI_2 (3.1415926)

#include <qgis.h>
#include <qgsmapcanvas.h>
#include <qgsmaplayer.h>

class gis_dev : public QMainWindow
{
   Q_OBJECT

public:
   gis_dev(QWidget* parent = Q_NULLPTR);

public slots:
   void slotAddVector();

private:
   Ui::gis_devClass ui;

   QgsMapCanvas* mapCanvas; // 地图画布

   QList<QgsMapLayer*> mapCanvasLayerSet; // 地图画布所用的图层集合
};

gis_dev.cpp

#include "gis_dev.h"
#include <QtWidgets/QFileDialog>
#include <qgsvectorlayer.h>
#include <qgslayoutitemregistry.h>
#include <qgsrasterlayer.h>
#include <QtWidgets/qmessagebox.h>

gis_dev::gis_dev(QWidget* parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);
	connect(ui.m_actAddVector, SIGNAL(triggered(bool)), this, SLOT(slotAddVector()));

	mapCanvas = new QgsMapCanvas();
	this->setCentralWidget(mapCanvas);

	mapCanvas->enableAntiAliasing(true);
	mapCanvas->setCanvasColor(QColor(255, 255, 255));
	mapCanvas->setVisible(true);
}

void gis_dev::slotAddVector()
{
	QString filename = QFileDialog::getOpenFileName(this, tr("open vector"), "", "*.shp;;*.*");
	QStringList temp = filename.split(QDir::separator());
	QString basename = temp.at(temp.size() - 1);
	QgsVectorLayer* vecLayer = new QgsVectorLayer(filename, basename, "ogr");// , false);
	if (!vecLayer->isValid())
	{
		QMessageBox::critical(this, "error", "layer is invalid");
		return;
	}

	//QgsMapLayerRegistry::instance()->addMapLayer(vecLayer);
	mapCanvasLayerSet.append(vecLayer);
	mapCanvas->setExtent(vecLayer->extent());
	mapCanvas->setLayers(mapCanvasLayerSet);
	mapCanvas->setVisible(true);
	mapCanvas->freeze(false);
	mapCanvas->refresh();

};

main.cpp

//main.cpp
#include "gis_dev.h"
#include <QtWidgets/QApplication>
#include <qgsapplication.h>
int main(int argc, char* argv[])
{
	QgsApplication a(argc, argv, true);
	QgsApplication::setPrefixPath("D:/QGIS 3.16/", true);
	QgsApplication::initQgis();    //初始化QGIS应用
	gis_dev w;
	w.show();
	return a.exec();
}

使用release版本执行编译,即可生成"gis_dev.exe"。

5. 运行测试代码
如果此时双击"gis_dev.exe"运行,会报缺少很多dll文件的错误,因为需要将Qt5依赖的文件拷贝到项目文件目录下。将
D:\OSGeo4W\apps\qgis\bin
D:\OSGeo4W\bin
D:\OSGeo4W\apps\Qt5\bin
目录下dll文件拷贝到工程Release目录下
还是有可能会缺dll文件,就需要用到Qt5自带的“windeployqt.exe”程序,可以用如下方法添加:

  1. 从目录“D:\OSGeo4W64\apps\Qt5\bin”中拷贝windeployqt.exe文件到工程目录(D:\BOOKS\VSProject\gis_dev\x64\Release)下,把它和工程生成的gis_dev.exe文件放在一起。
  2. 其次,把“D:\OSGeo4W64\apps\Qt5\bin”添加到系统的环境变量的path中,重启电脑。
  3. 打开VS 2019开发人员cmd窗口,输入命令windeployqt [exe文件的路径],比如我的是“windeployqt D:\BOOKS\VSProject\gis_dev\x64\Release\gis_dev.exe”,按下回车就完成了资源拷贝。如图所示:
    在这里插入图片描述

完成拷贝后再运行测试程序就能正常运行。
在这里插入图片描述

6. 可能遇到的问题
无法打开源文件 “ui_gis_dev.h”
创建新项目后发现有无法打开ui_gis_dev.h的错误。
解决方案:
在工具-外部工具中配置uic编译工具
在这里插入图片描述

如图所示,再编译cpp文件后就得到了ui_QtGuiApplication2.h在工程文件夹里,将它添加到工程即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值