QGIS3.18.3+QT 5.11.2+VS2019二次开发(2)添加和移除 栅格/矢量图层

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();
}

总结

以上就是今天要讲的内容,结果如下图,本文介绍了打开和移除 栅格/矢量图层,下文将讲解:窗口布局和添加图层管理器。
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学海一叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值