QGIS3.18.3+QT 5.11.2+VS2019二次开发(2)添加和移除 栅格/矢量图层
文章目录
前言
上文讲解了界面以及菜单栏的制作,但没有给菜单栏组件添加相应的行为,这一节讲解如何给菜单栏组件加上相应的行为(添加和移除 栅格/矢量图层)。
提示:以下是本篇文章正文内容,下面案例可供参考
一、槽函数
上文已经声明并空实现了一个槽函数 on_openFileAction_triggered(),那么槽函数是什么呢?槽函数是用于点击组件会触发的结果,是connect函数的一部分。比如我们创建了Open这个打开文件的行为,那么就需要和它关联相关的槽函数。
语法:
connect(发送者,信号,接收者,槽函数)
二、项目代码
1.创建项目
创建QT Widgets Application项目-MyQGIS01,并且拷贝好相关动态库(.dll)
添加栅格矢量数据前,要了解一些概念–画布和图层,要显示图像,我们首先要有一块背景板确定范围,也就是画布,然后我们可以将我们的图像贴到画布上,可以叠加,谓之为图层。所以我们要添加功能前,我们需要先定义和初始化画布(QgsMapCanvas)和图层(qgsmaplayer、qgsvectorlayer、qgsrasterlayer)
2.MyQGIS01.h
代码如下(示例):
#include <QtWidgets/QMainWindow>
#include "ui_MyQGIS01.h"
//自己引入的库
#include <qmenu.h> //QT菜单类
#include <qaction.h> //QT行为类
#include "qgsrasterlayer.h" //QGIS栅格图层
#include "qgsvectorlayer.h" //QGIS矢量图层
#include "qgsmaplayer.h" //QGIS图层
#include "qgsmapcanvas.h" //QGIS画布
class MyQGIS01 : public QMainWindow
{
Q_OBJECT
public:
MyQGIS01(QWidget *parent = Q_NULLPTR); //构造函数
private:
//菜单栏
QMenu* fileMenu; //定义文件菜单(一级菜单)
QAction* openRasterFileAction; //定义打开栅格文件菜单行为(二级菜单)
QAction* openVectorFileAction; //定义打开矢量文件菜单行为(二级菜单)
QAction* removeFileAction; //定义移除文件菜单行为(二级菜单)
//地图画布
QgsMapCanvas* mapCanvas;
QList<QgsMapLayer*> layers; //存储加载的图层
public slots: //槽函数
void on_openRasterFileAction_triggered();
void on_openVectorFileAction_triggered();
void on_removeFileAction_triggered();
};
3.MyQGIS01.cpp
代码如下(示例):
#include "MyQGIS01.h"
//自己引入的库
#include <qmenubar.h> //QT菜单栏库,用来存放菜单
#include <qfiledialog.h> //QT文件目录库,用来打开文件选择窗口
#include "qmessagebox.h" //QT信息盒子,用来显示操作提示
//构造函数
MyQGIS01::MyQGIS01(QWidget *parent)
: QMainWindow(parent)
{
this->resize(600, 400); //设置gisTest2类窗口大小
// 菜单栏初始化
fileMenu =this->menuBar()->addMenu("File"); //菜单栏添加文件菜单
openRasterFileAction = new QAction("Open raster", this); //设置文件菜单栏下二级菜单Open菜单
this->connect(openRasterFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openRasterFileAction_triggered())); //关联Open和槽函数(点击产生结果)
fileMenu->addAction(openRasterFileAction); //一级菜单文件添加二级菜单Open
openVectorFileAction = new QAction("Open vector", this);
this->connect(openVectorFileAction, SIGNAL(triggered(bool)), this, SLOT(on_openVectorFileAction_triggered()));
fileMenu->addAction(openVectorFileAction);
removeFileAction = new QAction("Remove file", this);
this->connect(removeFileAction, SIGNAL(triggered(bool)), this, SLOT(on_removeFileAction_triggered()));
fileMenu->addAction(removeFileAction);
//----------------------
//初始化地图画布
mapCanvas = new QgsMapCanvas();
this->setCentralWidget(mapCanvas); //将地图画布放置我们创建的主窗口中心
mapCanvas->setCanvasColor(QColor(255, 255, 255)); //设置地图画布为白色
mapCanvas->setVisible(true);
mapCanvas->enableAntiAliasing(true);
}
//-------------------------------------------------------------------------------------------------------------------------------
//槽函数:打开并显示栅格数据
void MyQGIS01::on_openRasterFileAction_triggered() {
//步骤1:打开文件选择对话框
QString fileName = QFileDialog::getOpenFileName(this, tr("Open raster file"), "", "remote sensing image(*.tif *.tiff);;image(*.jpg *.jpeg *.png *.bmp)");
if (fileName.isNull()) //如果文件未选择则返回
{
return;
}
QStringList temp = fileName.split('/');
QString basename = temp.at(temp.size() - 1);//获取栅格数据名称
//步骤2:创建QgsRasterLayer类
QgsRasterLayer* rasterLayer = new QgsRasterLayer(fileName, basename, "gdal");
//如果不是geotiff文件,则提示错误
if (!rasterLayer->isValid())
{
QMessageBox::critical(this, "error", QString("layer is invalid: \n") + fileName);
return;
}
//步骤3:添加栅格数据
QgsProject::instance()->addMapLayer(rasterLayer); //注册
mapCanvas->setExtent(rasterLayer->extent()); //将画布范围设置为栅格图层范围
layers.append(rasterLayer); //将栅格图层追加到链表中
mapCanvas->setLayers(layers); //将图层画到画布上
mapCanvas->setVisible(true);
mapCanvas->freeze(false);
mapCanvas->refresh(); //更新画布
}
//-------------------------------------------------------------------------------------------------------------------------------
//槽函数:打开并显示矢量数据
void MyQGIS01::on_openVectorFileAction_triggered()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
if (fileName.isNull()) //如果文件未选择则返回
{
return;
}
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;
}
//QGIS 3注册方式
QgsProject::instance()->addMapLayer(vecLayer);
mapCanvas->setExtent(vecLayer->extent());
layers.append(vecLayer);
mapCanvas->setLayers(layers);
mapCanvas->setVisible(true);
mapCanvas->freeze(false);
mapCanvas->refresh();
}
//-------------------------------------------------------------------------------------------------------------------------------
//槽函数:移除图层
void MyQGIS01::on_removeFileAction_triggered() {
layers.clear(); //从链表中清除所有图层
mapCanvas->setLayers(layers); //将图层画到画布上
mapCanvas->setVisible(true);
mapCanvas->freeze(false);
mapCanvas->refresh(); //更新画布
}
3.main.cpp
代码如下(示例):
#include "MyQGIS01.h"
#include <qgsapplication.h>
int main(int argc, char *argv[])
{
QgsApplication a(argc, argv, true); //创建一个QGIS应用
//设置qgis应用的路径
QgsApplication::setPrefixPath("D:\QGIS-3.18.3\apps\qgis", true);
QgsApplication::initQgis(); //初始化QGIS应用
MyQGIS01 w;
w.show();
return a.exec();
}
总结
以上就是今天要讲的内容,结果如下图,本文介绍了打开和移除 栅格/矢量图层,下文将讲解:窗口布局和添加图层管理器。