一、前言
开发环境的搭建请参考第一篇文章:
https://blog.csdn.net/qfl_sdu/article/details/112967169
本例主要实现了以下功能:
- 加载shp文件并显示
- 显示图层控制器,图层控制器能够控制图层的显示和隐藏
- 显示标签(label)
- 状态栏显示经纬度坐标
图层控制器的右键菜单目前还没有做,会在后续的文章中说明。
标签的显示样式也没有做处理,也会在后续的文章中说明。
代码中虽然添加了栅格图层的加载,但是没有测试,请谨慎参考。
废话不多说,先上效果图:
二、代码
Ui文件中添加action,并绑定槽函数,如下图
关键部分在代码中都有注释,直接上代码:
.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//QGIS include
#include "qgsmapcanvas.h"
#include "qgsmaplayer.h"
//图层控制窗口
#include "qgslayertreeview.h"
#include "qgslayertreemapcanvasbridge.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_actionVectorLayer_triggered(); //添加矢量图层
void on_actionRasterLayer_triggered(); //添加栅格图层
void on_actionhaha_triggered(); //设置图层控制窗口的显示/隐藏
void slot_showPosition(const QgsPointXY& p);//显示鼠标点的坐标
private:
void InitLayerTreeMapcanvasBridge(); //初始化图层控制窗口与画布间的桥接器
private:
Ui::MainWindow *ui;
//图层显示相关
QgsMapCanvas* m_mapcanvas; //图层管理器
QList<QgsMapLayer *> m_layersList; //存储加载的图层
//图层控制窗口相关
bool m_bShowLayerCtrlWnd; //是否显示图层控制窗口
QgsLayerTreeView* m_layerTreeView; //图层控制窗口
QgsLayerTreeMapCanvasBridge* m_bridge; //图层控制窗口与画布关联桥接器
};
#endif // MAINWINDOW_H
.cpp文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QGridLayout>
//QGIS
#include "qgsvectorlayer.h"
#include "qgsproject.h"
#include "qgsrasterlayer.h"
#include "qgslayertreemodel.h"
#include "qgsmaptoolpan.h"
//QGIS LABEL
#include "qgspallabeling.h"
#include "qgsvectorlayerlabeling.h"
MainWindow