QGIS3.28的二次开发八:显示shp的属性表

这里实现两个基本的 GIS 软件需求:矢量图层的属性表显示,以及根据属性筛选要素。

具体需求如下:

  • 加载一个矢量图层并打开其属性表;
  • 输入筛选条件确认无误后,画布上和属性表中均只显示筛选后的要素。

QGIS 提供了若干类用于实现图层属性表。属性表基于 Qt 的 QTableView 实现,利用了 QT中的Model/View 机制。QGIS 用于实现属性表所涉及到类比较多,彼此关系也不太直观, 这里仅做简单的总结。

本篇文章主要用到的与实现图层属性表相关的类有四个,分别为

QgsVectorLayerCache

该类继承自QObject,用于缓存给定QgsVectorLayer的特征,缓存的特征可以通过QgsAbstractCacheIndex进行索引,对给定用例进行适当的索引可能会大大提高性能。构造QgsAttributeTableModel时,只能使用图层的数据缓存,而不能直接使用原图层,应该是为了避免数据冲突之类的问题。

 QgsAttributeTableModel 

一个由QgsVectorLayerCache支持的模型,继承自QAbstractTableModel,它能够为QAbstractItemView提供特征/属性信息,作为QgsAttributeTableView的后端数据源。也能够为它的QModelIndexes生成编辑器小部件,在本QGIS源代码中主要被称为“主模型”。

QgsAttributeTableView

该类继承自QgsTableView,进而继承自QTableView。提供QgsVectorLayer特性的表视图,是最终显示图层属性表的视图组件。

QgsAttributeTableFilterModel

该类的继承关系如下图所示,为QSortFilterProxyModel和QgsFeatureModel的子类。其基类QSortFilterProxyModel作为数据源模型和视图的中间处理器,提供对源模型数据筛选和排序的能力。基类使用时必须通过setSourceModel()方法指定其源模型,然后调用QTreeView 的setModel()方法传入QSortFilterProxyModel这个中间模型(而非传入源模型),这样视图显示的数据就可以通过本中间模型进行排序和筛选而不影响到源模型中的数据。

运行截图

关键代码

#include "DefMainWindow.h"
#include <qgsattributetableview.h>	// 显示图层属性表的视图组件
#include <qmessagebox.h>	// 弹出提示框DefMainWindow::DefMainWindow(QWidget *parent) :QMainWindow(parent),mCanvas(this)
{ui.setupUi(this);ui.verticalLayout->addWidget(&mCanvas);mpVectorLayer = new QgsVectorLayer("E:\\TestImage\\中华人民共和国\\中华人民共和国.shp", "中华人民共和国");// 因为图层编码为utf8,这里也需要设置编码为utf8mpVectorLayer->setProviderEncoding("utf-8");// 参数一为要缓存特征的图层,参数二为缓存的大小,这里我们直接将缓存大小设定为要素数量,即全部缓存mpVectorLayerCache = new QgsVectorLayerCache(mpVectorLayer, mpVectorLayer->featureCount());// 创建源模型mpAttrTableModel = new QgsAttributeTableModel(mpVectorLayerCache);// 在使用此模型作为任何其他中间模型的源模型之前,将该图层加载到模型中mpAttrTableModel->loadLayer();// 创建中间模型,用于制作属性表筛选器// 参数一为Canvas画布,参数二为源模型// 筛选执行的过程中,画布上同样要更新渲染(只显示筛选后的要素)mpAttrTableFilterModel = new QgsAttributeTableFilterModel(&mCanvas, mpAttrTableModel);// 为中间模型设置源模型,由于上面创建中间模型的构造函数中已经设置了源模型,所以此句可以忽略mpAttrTableFilterModel->setSourceModel(mpAttrTableModel);// 将图层加载到Canvas画布mCanvas.setLayers(QList<QgsMapLayer*>() << mpVectorLayer);// 将画布缩放到完整范围,用于显示完整图层mCanvas.zoomToFullExtent();QObject::connect(ui.btnOpenAttributeTable, &QPushButton::clicked, this, &DefMainWindow::onOpenAttributeTableButtonClicked);QObject::connect(ui.btnApplyWhereClause, &QPushButton::clicked, this, &DefMainWindow::onApplyWhereClauseButtonClicked);
}// 点击“打开属性表”按钮,弹出属性表窗口
void DefMainWindow::onOpenAttributeTableButtonClicked()
{// 创建视图QgsAttributeTableView* pView = new QgsAttributeTableView(this);// 该方法来自QWidget,设置窗口为半模态类型pView->setWindowModality(Qt::WindowModality::WindowModal);// 设置窗口属性// Qt::Window 表示无论是否有父窗口部件,新窗口部件都是一个窗口,通常有一个窗口边框和一个标题栏pView->setWindowFlag(Qt::Window);// 设置窗口标题pView->setWindowTitle(u8"图层属性表");// 设置模型 void QgsAttributeTableView::setModel(QgsAttributeTableFilterModel * filterModel)	pView->setModel(mpAttrTableFilterModel);// 设置窗口大小pView->resize(700, 450);// 展示窗口pView->show();
}// 输入查询语句,筛查属性值
void DefMainWindow::onApplyWhereClauseButtonClicked()
{// 获取输入的查询语句QString whereClause = ui.leWhereClause->text();// 设置的同时会进行查询,如果查询出现错误则返回falseif (!mpVectorLayer->setSubsetString(whereClause)){// 如果有查询出现错误if (mpVectorLayer->dataProvider()->hasErrors()){// 显示记录的错误信息QMessageBox::warning(this, u8"错误", QString(u8"查询执行错误。返回信息:\n\n%1").arg(mpVectorLayer->dataProvider()->errors().join("\n")));// 清除记录的错误信息mpVectorLayer->dataProvider()->clearErrors();}// 如果查询字符串设置失败,而且没有错误,说明设置过滤表达式失败else{QMessageBox::warning(this, u8"错误", u8"设置过滤表达式失败。");}}
}

 查询功能详解

// 输入查询语句,筛查属性值
void DefMainWindow::onApplyWhereClauseButtonClicked()
{// 获取输入的查询语句QString whereClause = ui.leWhereClause->text();// 设置的同时会进行查询,如果查询出现错误则返回falseif (!mpVectorLayer->setSubsetString(whereClause)){// 如果有查询出现错误if (mpVectorLayer->dataProvider()->hasErrors()){// 显示记录的错误信息QMessageBox::warning(this, u8"错误", QString(u8"查询执行错误。返回信息:\n\n%1").arg(mpVectorLayer->dataProvider()->errors().join("\n")));// 清除记录的错误信息mpVectorLayer->dataProvider()->clearErrors();}// 如果查询字符串设置失败,而且没有错误,说明设置过滤表达式失败else{QMessageBox::warning(this, u8"错误", u8"设置过滤表达式失败。");}}
}

(1)bool QgsVectorLayer::setSubsetString(const QString & subset)

subset可以是sql语句的where子句,也可以是特定于底层数据提供程序和数据存储的其他定义字符串。如果设置subset字符串成功则返回true,否则返回false。QgsVectorLayer::setSubsetString()方法会将用户输入的subset应用到图层上,筛选子句被设置成功后,会自动映射到以其为源的数据缓冲,即之前建立的 QgsVectorLayerCache 对象上。相应的数据源模型也将得到更改,进而中间模型也会改,最终反映到 QgsAttributeTableView 的显示上。

(2)const QgsVectorDataProvider * QgsVectorLayer::dataProvider()const 

以正确的方式返回该层的数据提供程序,它可能是nullptr。在获取和处理图层错误信息时,需要通过QgsVectorLayer::dataProvider()方法获取QgsVectorDataProvider 类。这个类是对一切矢量数据源类型的抽象,类似于数据处理的中间件。

 (3)bool QgsVectorDataProvider::hasErrors()const

查询出现错误会返回true

(4)QStringList QgsVectorDataProvider::errors()const

获取记录的错误信息

(5)void QgsVectorDataProvider::clearErrors()

清除记录的错误信息

注意:查询时输入的待查询的字符串要用单引号!

参考文章 文章页 | mriiiron's blog 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/87808.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山景DSP芯片可烧录AP8224C2音频处理器方案

AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品&#xff0c;适用于传统音响系统、新兴的蓝牙或Wifi 无线音频产品、Sound Bar 和调音台等市场。该处理器在总体架构和系统组成上&#xff0c;充分考虑了音频领域的特点&#xff0…

STM32 CubeMX (uart_IAP串口)简单示例

STM32 CubeMX STM32 CubeMX &#xff08;串口IAP&#xff09; STM32 CubeMXIAP有什么用&#xff1f;整体思路 一、STM32 CubeMX 设置时钟树UART使能UART初始化设置 二、代码部分文件移植![在这里插入图片描述](https://img-blog.csdnimg.cn/0c4841d8328b4169a8833f15fe3d670c.p…

python num循环怎么从1开始

如何实现python for循环从1开始&#xff1f; range()函数的作用和用法&#xff1a; 编写一个从数值1开始的循环&#xff1a; 执行后得到的结果 其他注意事项

JavaWeb-Servlet服务连接器(三)

目录 Response响应对象 1.基本功能 2.重定向 3.路径 4.服务器输出数据到浏览器 Response响应对象 1.基本功能 设置响应行&#xff1a;格式为 HTTP/1.1 200 OK&#xff0c;可以使用 setStatus(int sc) 方法设置状态码为 200 表示成功。 方法名称描述setStatus(int sc)设…

STM32定时器级联功能

参考&#xff1a;官方文档《stm32f4xx参考手册.pdf》 级联功能&#xff0c;可以把两个定时器的功能关联起来&#xff0c;具体有以下几种&#xff1a; 本文只讲其中一个功能&#xff0c;定时器1给定时器2当分频器。这种功能可以把两个32位定时器&#xff0c;合并为为一个64位定…

tampermonky插件安装

换了电脑&#xff0c;今天重新下载了tampermonky&#xff0c;哎&#xff0c;被自己气死的一上午。wwwww&#xff0c;最后发现最大的问题就是没有问题。 Edge能不用下载直接安装&#xff0c;但是何少 下载tampermonky&#xff0c;在谷歌程序扩展-chrome://extensions/ 添加解压…

GPT-4助力数据分析:提升效率与洞察力的未来关键技术 | 京东云技术团队

摘要 随着大数据时代的到来&#xff0c;数据分析已经成为企业和组织的核心竞争力。然而&#xff0c;传统的数据分析方法往往无法满足日益增长的数据分析需求的数量和复杂性。在这种背景下&#xff0c;ChatGPT-4作为一种先进的自然语言处理技术&#xff0c;为数据分析带来了革命…

CCLINK IE转MODBUS-TCP网关modbus tcp协议详解

你是否曾经遇到过需要同时处理CCLINK IE FIELD BASIC和MODBUS两种数据协议的情况&#xff1f;捷米的JM-CCLKIE-TCP网关可以帮助你解决这个问题。 捷米JM-CCLKIE-TCP网关可以分别从CCLINK IE FIELD BASIC一侧和MODBUS一侧读写数据&#xff0c;然后将数据存入各自的缓冲区。接着…

计算机网络 ARP协议 IP地址简述

ARP只能在一个链路或一段网络上使用

gitee linux免密/SSH 方式连接免登录

目录 生成SSH公钥通过 ssh-keygen 程序创建找到SSH公钥 在gitee中添加公钥参考 生成SSH公钥 通过 ssh-keygen 程序创建 shell> ssh-keygen -t rsa -C "xxxxxx.com" Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/i…

【CSS学习笔记】

学习内容 1.css是什么 2.CSS怎么用&#xff08;快速入门&#xff09; 3.CSS选择器&#xff08;重点 难点&#xff09; 4.美化页面&#xff08;文字、阴影、超链接、列表、渐变…&#xff09; 5.盒子模型 6.浮动 7.定位 8.网页动画&#xff08;特效&#xff09; 1.什么是CSS C…

Spring中的AOP

Spring中的AOP 一.Spring AOP的概念 1.AOP的概述 AOP的全称是Aspect Oriented Programming&#xff0c;即面向切面编程。是通过预编译方式和运行期间动态代理&#xff0c;实现程序功能的统一维护的一种技术。AOP是OOP面向对象编程的一种延续。 使用OOP编程时&#xff0c;虽然…

力扣 377. 组合总和 Ⅳ

题目来源&#xff1a;https://leetcode.cn/problems/combination-sum-iv/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 本题求的是排列总和&#xff0c;而且仅仅是求排列总和的个数&#xff0c;并不是把所有的排列都列出来。动规五部曲分析如下&…

开发命名规范

1项目命名规范 1、工程项目名&#xff0c;尽量想一些有意义、有传播价值的名称&#xff1b;比如星球、游戏、名人、名地名等&#xff1b;取名就跟给孩子取名一样&#xff0c;独特、有价值、有意义、好传播 2、所有的类都必须添加创建者和创建日期 3、所有代码&#xff1a;包括…

【Hystrix技术指南】(7)故障切换的运作流程原理分析(含源码)

背景介绍 目前对于一些非核心操作&#xff0c;如增减库存后保存操作日志发送异步消息时&#xff08;具体业务流程&#xff09;&#xff0c;一旦出现MQ服务异常时&#xff0c;会导致接口响应超时&#xff0c;因此可以考虑对非核心操作引入服务降级、服务隔离。 Hystrix说明 官方…

学术论文GPT源码解读:从chatpaper、chatwithpaper到gpt_academic

前言 之前7月中旬&#xff0c;我曾在微博上说准备做“20个LLM大型项目的源码解读” 针对这个事&#xff0c;目前的最新情况是 已经做了的&#xff1a;LLaMA、Alpaca、ChatGLM-6B、deepspeedchat、transformer、langchain、langchain-chatglm知识库准备做的&#xff1a;chatpa…

PS/LR2024专用智能磨皮插件Portraiture提高P图效率

Portraiture 4智能磨皮插件支持Photoshop和Lightroom&#xff01;Portraiture是一款智能磨皮插件&#xff0c;为Photoshop和Lightroom添加一键磨皮美化功能&#xff0c;快速对照片中皮肤、头发、眉毛等部位进行美化&#xff0c;无需手动调整&#xff0c;大大提高P图效率。全新4…

分布式搜索ElasticSearch-ES(一)

一、ElasticSearch介绍 ES是一款非常强大的开源搜索引擎&#xff0c;可以帮我们从海量的数据中快速找到我们需要的内容。 ElasticSearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack(ELK)&#xff0c;被广泛运用在日志数据分析&#xff0c;实时监控等领域。 …

C#应用处理传入参数 - 开源研究系列文章

今天介绍关于C#的程序传入参数的处理例子。 程序的传入参数应用比较普遍&#xff0c;特别是一个随操作系统启动的程序&#xff0c;需要设置程序启动的时候不显示主窗体&#xff0c;而是在后台运行&#xff0c;于是就有了传入参数问题&#xff0c;比如传入/h或者/min等等。所以此…

【MySQL】表的内外连接

目录 一、内连接 二、外连接 1、左外连接 2、右外连接 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查询。 语法&#xff1a; select 字段 from 表1 i…