#include <qgsapplication.h> // 管理图形界面
#include <qgsproviderregistry.h> // 设置并检查数据插件目录
#include <qgsmapcanvas.h> // 创建画布
#include <qgsvectorlayer.h> // 用于创建矢量图层
#include <qgslayertree.h> // 提供命名空间,包含用于层树操作的辅助函数
#include <qgslayertreemodel.h> // 创建模型
#include <qgslayertreeview.h> // 创建view
#include <qboxlayout.h> // 创建布局
#include <qgsproject.h> // 管理qgis工程的头文件
// 自定义控件LayerTreeDemo,继承自QWidget
class LayerTreeDemo :
public QWidget
{
public:
LayerTreeDemo(QWidget * parent = 0);
private:
// 画布
QgsMapCanvas mMapCanvas;
// 图层树 View
// QgsLayerTreeView 是 QTreeView 的子类,进而是QWidget的子类
QgsLayerTreeView mLayerTreeView;
// 更新画布图层的“事件回调”
void updateCanvasLayerSet();
};
// 构造函数
LayerTreeDemo::LayerTreeDemo(QWidget * parent) :
QWidget(parent),
mMapCanvas(this),
mLayerTreeView(this) {
// layerTreeRoot() 返回指向项目层树的根(不可见)节点的指针
QgsLayerTree* pLayerTreeRoot = QgsProject::instance()->layerTreeRoot();
// visibilityChanged当树中节点的检查状态被更改时触发
QObject::connect(pLayerTreeRoot, &QgsLayerTreeNode::visibilityChanged, this, &LayerTreeDemo::updateCanvasLayerSet);
// 模型监听层树中的更改,并适当地发出更改信号,以便使用该模型的任何视图都相应地更新,参数填根节点
QgsLayerTreeModel* pLayerTreeModel = new QgsLayerTreeModel(pLayerTreeRoot);
// 设置模型标志 QgsLayerTreeModel::Flag,Flag为枚举类型
// AllowNodeChangeVisibility允许用户使用复选框设置节点可见性
pLayerTreeModel->setFlag(QgsLayerTreeModel::AllowNodeChangeVisibility);
// model只接收QgsLayerTreeModel,视图进行模型的绑定
mLayerTreeView.setModel(pLayerTreeModel);
// 设置一下最大宽度以便给画布留出更多显示空间,是QWidget的函数
mLayerTreeView.setMaximumWidth(200);
// 创建一个水平布局
QHBoxLayout* pLayout = new QHBoxLayout();
// addWidget()传入一个指针
// mLayerTreeView控件放在左边
pLayout->addWidget(&mLayerTreeView);
// mMapCanvas控件放在右边
pLayout->addWidget(&mMapCanvas);
// 设置布局到此窗体,setLayout是QWidget的函数
this->setLayout(pLayout);
this->resize(1000, 600); // 设置窗体尺寸为 1000 * 600
this->setWindowTitle(u8"QGIS 二次开发:图层树"); // 设置窗体标题
// 从磁盘 .shp 文件创建矢量图层
QgsVectorLayer* pVectorLayer_1 = new QgsVectorLayer("E:\\TestImage\\深圳各区矢量图\\宝安区\\宝安区_中华人民共和国.shp", "中华人民共和国");
QgsVectorLayer* pVectorLayer_2 = new QgsVectorLayer("E:\\TestImage\\深圳各区矢量图\\宝安区\\宝安区_省界.shp", "省界");
QgsVectorLayer* pVectorLayer_3 = new QgsVectorLayer("E:\\TestImage\\深圳各区矢量图\\宝安区\\宝安区_市界.shp", "市界");
QgsVectorLayer* pVectorLayer_4 = new QgsVectorLayer("E:\\TestImage\\深圳各区矢量图\\宝安区\\宝安区_县界.shp", "县界");
QgsVectorLayer* pVectorLayer_5 = new QgsVectorLayer("E:\\TestImage\\深圳各区矢量图\\宝安区\\宝安区_乡镇边界.shp", "乡镇边界");
// 确认图层是否创建成功
qDebug() << "Is layer valid:" << pVectorLayer_1->isValid();
qDebug() << "Is layer valid:" << pVectorLayer_2->isValid();
qDebug() << "Is layer valid:" << pVectorLayer_3->isValid();
qDebug() << "Is layer valid:" << pVectorLayer_4->isValid();
qDebug() << "Is layer valid:" << pVectorLayer_5->isValid();
// 把图层添加到工程,越先添加的图层,越靠近底部
QgsProject::instance()->addMapLayer(pVectorLayer_1);
QgsProject::instance()->addMapLayer(pVectorLayer_2);
QgsProject::instance()->addMapLayer(pVectorLayer_3);
QgsProject::instance()->addMapLayer(pVectorLayer_4);
QgsProject::instance()->addMapLayer(pVectorLayer_5);
// 执行回调函数,将图层添加到画布
updateCanvasLayerSet();
// 缩放到全图
mMapCanvas.zoomToFullExtent();
}
void LayerTreeDemo::updateCanvasLayerSet()
{
// 设置应该在画布上显示的层列表
// layerTreeRoot()返回一个QgsLayerTreeNode
// checkedLayers()返回属于此节点或其子节点的所有已选中层的列表
mMapCanvas.setLayers(QgsProject::instance()->layerTreeRoot()->checkedLayers());
// 重新绘制画布地图
mMapCanvas.refresh();
}
int main(int argc, char **argv)
{
// 创建 QgsApplication 实例
QgsApplication app(argc, argv, true);
// 设置并检查数据插件目录
QgsProviderRegistry::instance("D:\\OSGeo4W\\apps\\qgis-ltr\\plugins");
// 控制台打印已载入的插件目录
qDebug() << "QGIS data providers loaded:" << QgsProviderRegistry::instance()->providerList();
// 设置 GDAL 数据目录环境变量
qputenv("GDAL_DATA", "D:\\OSGeo4W\\apps\\gdal\\share\\gdal");
// 创建主窗体
LayerTreeDemo w;
w.show();
// 启动 QgsApplication 实例
return app.exec();
}
没有合适的资源?快使用搜索试试~ 我知道了~
QGIS二次开发:显示多个图层,编程环境为QGIS3.28和VS2017
共24个文件
tlog:6个
pdb:2个
db:2个
需积分: 5 7 下载量 51 浏览量
2023-08-15
11:07:49
上传
评论
收藏 30.69MB RAR 举报
温馨提示
在实际开发中我们通常会遇到同时显示多个图层,并且还要实时显示和隐藏各图层的需求,如同 ArcGIS 的图层列表那样,界面左侧显示图层列表,列出当前已加载的所有图层,同时每个图层前面有复选框可以控制图层的显示/隐藏;界面右侧为画布,按图层列表的适当顺序显示所有未隐藏的图层。具体该怎么实现呢?编程环境为QGIS3.28和VS2017,效果参考我的博客链接https://kantlee.blog.csdn.net/article/details/132176893
资源推荐
资源详情
资源评论
收起资源包目录
qgis02_LayerTreeView.rar (24个子文件)
b3a64203a1764e4902cb14aa2f0e9cf6.rar.temp 20MB
qgis02_LayerTreeView
.vs
qgis02_LayerTreeView
v15
Browse.VC.db 26.84MB
.suo 33KB
ipch
AutoPCH
b213c385bd68b79
MAIN.ipch 163.25MB
x64
Debug
qgis02_LayerTreeView.exe 166KB
qgis02_LayerTreeView.pdb 1.51MB
qgis02_LayerTreeView.ilk 1.52MB
qgis02_LayerTreeView.sln 1KB
qgis02_LayerTreeView
symbology-style.db 92KB
main.cpp 5KB
x64
Debug
vc141.pdb 4.57MB
vc141.idb 731KB
qgis02_LayerTreeView.log 120B
qgis02_L.b3d966b0.tlog
CL.write.1.tlog 596B
qgis02_LayerTreeView.lastbuildstate 208B
CL.command.1.tlog 764B
link.command.1.tlog 1KB
link.read.1.tlog 3KB
link.write.1.tlog 582B
CL.read.1.tlog 65KB
main.obj 607KB
qgis02_LayerTreeView.vcxproj 8KB
qgis02_LayerTreeView.vcxproj.user 429B
qgis02_LayerTreeView.vcxproj.filters 949B
共 24 条
- 1
资源评论
程序员班长
- 粉丝: 6519
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 2022NOC软件创意编程赛项真题python小学高年级-决赛(有解析)
- mathml转换latex需要的xsl文件
- 2022NOC软件创意编程赛项真题图形化小学高年级-决赛赛(有解析)
- gbase驱动下载gbase-connector-java-8.3.81.53驱动下载
- 2022NOC软件创意编程赛项真题图形化小学低年级-决赛赛(有解析)
- InsightFace从青铜到王者,超大规模人脸识别的优雅解法
- python后端开发spider框架详解
- 基于 STM32 与 ESP8266 的智能家居系统源码.zip
- 毕业设计:基于SSM的mysql-个性化点餐配送系统(源码 + 数据库 + 说明文档)
- 基于matlab的鱼苗计数识别(GUI界面).zip代码57
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功