QGis二次开发基础 -- 属性表格

属性表想必是每个GIS系统必备的功能,也正是因为GIS矢量数据支持各种各样的属性与针对属性的操作功能,才使得GIS矢量图形与普通的绘画图形具有根本的区别。今天来探讨一下用QGis实现矢量图形的属性表显示功能。
属性表)


写在前面

本来核心的代码就几句,直接贴上来似乎就能解决问题。但是本着严谨的态度,还是详细的分析一下机理。借此也阐述出我对开源代码的学习方法,并不是我的方法就有多么好,而是希望大家能够从中看到一些可供借鉴的地方,同时也让我与大家产生了交流,完善我自己的方法。因此后续的内容分为两块,一个是详细的介绍使用QGis属性表的几个类和它们的调用机理,另一个是展示如何通过“抄袭”的办法直接将QGis的属性表窗口加入到我们的工程中来。

认识几个类

首先,还是来介绍一下所需要用到的几个与属性表相关的类以及它们的作用,它们分别是:

View 和 Model

QgsAttributeTableView 和 QgsAttributeTableModel 这两个类是按照 Qt 的MVC(Model-View-Controller)架构来创建的。QgsAttributeTableView 是继承于 QTableView 用于展示表格控件。QgsAttributeTableModel 继承于 QAbstractTableModel,用于给显示的 View 控件提供数据支持。关于MVC架构的资料,可以看 Qt 的官方帮助文档或者百度百科。这里引用Qt Assistant中的一个图形,方便理解。

这里写图片描述

简单的说,也就是数据存储在 Model 中,用 View 来展示给用户。对于属性表来说,QgsAttributeTableModel 里面存储着矢量数据的属性数据, 通过绑定到 QgsAttributeTableView 上展示给用户。

QgsVectorLayerCache

这个类的作用是加载并缓存 QgsVectorLayer 矢量数据中的要素。看看它的构造函数形式

QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent = NULL );

第一个参数是矢量图层,第二个参数控制缓存要素的最大数量,当图层中的要素数量超过这个最大数量,就会有一部分要素不做缓存,而是用到的时候再加载。缓存可以提供要素的设置、查询等操作。

从这个构造函数可以知道,只需要一个 QgsVectorLayer 类就能构造出对应的缓存类。

QgsAttributeTableFilterModel

这里写图片描述

QgsAttributeTableFilterModel 继承自 QgsFeatureModel, 用来控制 QgsAttributeTableModel 当中的数据显示方式,类似一个“筛子”一样来选择要素的显示与隐藏。这么说也许不太直观,看一看类中的一个enum应该就理解了。

enum FilterMode
{
   ShowAll, // 全部显示
   ShowSelected, // 只显示选择的要素
   ShowVisible, // 只显示可见要素
   ShowFilteredList, // 只显示过滤掉的要素
   ShowEdited  // 只显示编辑的要素
};

再来看看它的构造函数原型

QgsAttributeTableFilterModel( QgsMapCanvas* canvas, QgsAttributeTableModel* sourceModel, QObject* parent = 0 );

需要一个 QgsMapCanvas 和一个 QgsAttributeTableModel 作为参数构造。用到 QgsAttributeTableModel 是自然的,因为需要原始数据来“筛选”。而需要 QgsMapCanvas 则是便于提供用户从地图显示控件上进行要素“筛选”的功能。

QgsEditorWidgetRegistry

这个类看起来好像跟属性表格没什么关系,但少了它属性表格是不能够被正确初始化的,虽然代码不会报错,但属性表格会变成下面这样

这里写图片描述

表格中的要素个数是正确显示的,但是属性字段却没有显示。出现这种错误且代码不报错真是很令人头疼,如果不明白机理,都不知道是错在哪里(老实说,我就被这个错误折磨过,好在功夫不负有心人)。

QgsEditorWidgetRegistry 这个类管理着所有可编辑控件的创建工厂。什么意思呢?QGis中对于提供给用于编辑数据的控件都是由不同的工厂类创建的,这个属于软件工程设计模式中的

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值