前言
本文意在整理学习资料,以备不时之需。如有谬误,欢迎指正。
安装环境:Windows10+VS2022+QT5.14.2
VS敲代码及环境配置还是有一定优势的,其环境配置更直接更简单。
本次采用VS2022进行编写(已安装QT插件)安装VS+qt环境
参考文章:http://t.csdn.cn/04U0g
一、创建项目
创建一个SampleLabelTool
的项目
release
的版本就好,有些debug后会出错。
编译器版本 5.14.2_msvc2017_64
- 包含目录
D:\QT\OSGeo4W\include
D:\QT\OSGeo4W\apps\qgis-ltr\include
D:\QT\OSGeo4W\apps\Qt5\include
D:\QT\OSGeo4W\apps\Qt5\include\QtGui
D:\QT\OSGeo4W\apps\Qt5\include\QtXml
D:\QT\OSGeo4W\apps\Qt5\include\QtWidgets
D:\QT\OSGeo4W\apps\Qt5\include\QtCore
- 库目录
D:\QT\OSGeo4W\apps\qgis-ltr\lib
D:\QT\OSGeo4W\apps\Qt5\lib
- 附加依赖项
qgis_core.lib
qgis_app.lib
qgis_gui.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
当后期需要添加一些模块的时候,记得添加相应的文件路径(包含目录、附加依赖项)!!!
- 预处理器
_USE_MATH_DEFINES
- C++语言标准
ISO C++ 17标准
复制以下路径下的dll到项目目录
D:\QT\OSGeo4W\bin
D:\QT\OSGeo4W\apps\Qt5\bin
D:\QT\OSGeo4W\apps\qgis-ltr\bin
复制D:\QT\OSGeo4W\apps\Qt5\plugins
下面的platforms
文件夹到文件生成的exe目录下(如:D:\VisualStudio\projects\SampleLabelTool2\x64\Release
)
二、代码编写
1.引入库
代码如下(示例):
#include "SampleLabelTool.h"
#include <QtWidgets/QApplication>
#include<QgsApplication.h>
int main(int argc, char *argv[])
{
//初始化QGis
QgsApplication a(argc, argv, true);
QgsApplication::setPrefixPath("D:/QT/OSGeo4W/apps/qgis-ltr", true);
QgsApplication::initQgis();
SampleLabelTool w;
w.show();
return a.exec();
}
注:到此处可以尝试运行监测环境配置
2.绘制界面
在VS中直接用Qt Designer打开ui。
若打开会闪退,文件打开不稳定。
扩展-》Qt VS Tools->create pro
创建pro文件结束后,可以在文件夹直接以QT编译器打开
如上图所示,拖一个widget到窗体中,并使窗口右键布局设置为栅格布局gridLayout(撑满窗体)
然后将widget更名为widget_mapCanvas
3.编写代码
1.初始化画布
在SampleLabelTool.h中添加#include <QgsMapCanvas.h>
void SampleLabelTool::initMapCanvas(QWidget* parent)
{
mapCanvas = new QgsMapCanvas(parent);//创建画布
QGridLayout* pLayout = new QGridLayout(parent);//设置画布窗口为栅格布局
pLayout->addWidget(mapCanvas, 0, 0, 1, 1);//添加画布到栅格布局中
pLayout->setMargin(0);//设置栅格布局的空隙为0
QgsEditorWidgetRegistry a;
a.initEditors(mapCanvas);//注册画布
}
2.打开栅格数据
void SampleLabelTool::addRaster(QString rasterPath, QString basename)
{
qDebug() << "rasterPath :" << rasterPath;
qDebug() << "basename :" << basename;
QgsRasterLayer* rasterLayer = new QgsRasterLayer(rasterPath, basename, "gdal");
qDebug() << "isValid :" << rasterLayer->isValid();
if (!rasterLayer->isValid()) {
QMessageBox::critical(this, "error", "open raster file error");
return;
}
QgsProject::instance()->addMapLayer(rasterLayer);
mapCanvasLayerSet->append(rasterLayer);
mapCanvas->setExtent(rasterLayer->extent());
mapCanvas->setLayers(*mapCanvasLayerSet);
mapCanvas->setVisible(true);
mapCanvas->freeze(false);
mapCanvas->refresh();
}
2.打开矢量数据
void SampleLabelTool::addVector(QString vectorPath, QString basename)
{
qDebug() << "vectorPath :" << vectorPath;
qDebug() << "basename :" << basename;
QgsVectorLayer* vecLayer = new QgsVectorLayer(vectorPath, basename, "ogr");
if (!vecLayer->isValid()) {
QMessageBox::critical(this, "error", "open shape file error");
return;
}
QgsProject::instance()->addMapLayer(vecLayer);
mapCanvasLayerSet->append(vecLayer);
mapCanvas->setExtent(vecLayer->extent());
mapCanvas->setLayers(*mapCanvasLayerSet);
mapCanvas->setVisible(true);
mapCanvas->freeze(false);
mapCanvas->refresh();
}
总结
实现QGIS二次开发的环境配置,以及简单的代码编写