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

更新时间:2023-08-03 13:04:32 阅读: 评论:0

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中对于提供给⽤于编辑数据的控件都是由不同的⼯⼚类创建的,这个属于软件⼯程设计模式中的。⽽对所有的⼯⼚创建⼀个注册管理的类,通过不同的传⼊参数调⽤不同的⼯⼚进⾏构建,在这⾥就是 QgsEditorWidgetRegistry 类。具体都有哪些⽤于编辑的控件,看⼀看源代码就⼀⽬了然了。下⾯是QgsEditorWidgetRegistry 类中的 initEditors ⽅法的实现代码。
void QgsEditorWidgetRegistry::initEditors( QgsMapCanvas *mapCanvas, QgsMessageBar *messageBar )
{
QgsEditorWidgetRegistry *reg = instance();
reg->registerWidget( "Classification", new QgsClassificationWidgetWrapperFactory( tr( "Classification" ) ) );
reg->registerWidget( "Range", new QgsRangeWidgetFactory( tr( "Range" ) ) );
reg->registerWidget( "UniqueValues", new QgsUniqueValueWidgetFactory( tr( "Unique Values" ) ) );
reg->registerWidget( "FileName", new QgsFileNameWidgetFactory( tr( "File Name" ) ) );
reg->registerWidget( "ValueMap", new QgsValueMapWidgetFactory( tr( "Value Map" ) ) );
reg->registerWidget( "Enumeration", new QgsEnumerationWidgetFactory( tr( "Enumeration" ) ) );
reg->registerWidget( "Hidden", new QgsHiddenWidgetFactory( tr( "Hidden" ) ) );
reg->registerWidget( "CheckBox", new QgsCheckboxWidgetFactory( tr( "Check Box" ) ) );
reg->registerWidget( "TextEdit", new QgsTextEditWidgetFactory( tr( "Text Edit" ) ) );
reg->registerWidget( "ValueRelation", new QgsValueRelationWidgetFactory( tr( "Value Relation" ) ) );
reg->registerWidget( "UuidGenerator", new QgsUuidWidgetFactory( tr( "Uuid Generator" ) ) );
reg->registerWidget( "Photo", new QgsPhotoWidgetFactory( tr( "Photo" ) ) );
reg->registerWidget( "WebView", new QgsWebViewWidgetFactory( tr( "Web View" ) ) );
reg->registerWidget( "Color", new QgsColorWidgetFactory( tr( "Color" ) ) );
reg->registerWidget( "RelationReference", new QgsRelationReferenceFactory( tr( "Relation Reference" ), mapCanvas, messageBar ) );
reg->registerWidget( "DateTime", new QgsDateTimeEditFactory( tr( "Date/Time" ) ) );
}
可以看到有“Classification”、“Value Map”、“Check Box”、“Text Edit”等等控件。看到这⾥,就不难发现QgsEditorWidgetRegistry 和属性表格有什么关系了,我们⽤于编辑属性数据的“Text Edit”控件正是由 QgsEditorWidgetRegistry 管理的。
调⽤机理
明⽩了上⾯所列出的类,要显⽰属性表格的功能就容易了。
最开始要做的是⽤ QgsMapCanvas 初始化编辑控件
然后再开始构造并显⽰属性表格。
上海征兵网
属性表格⾃然需要⼀个⽮量图层(修改下⾯的⽂件路径字符串以及图层名称)
然后将它 Cache 进 QgsVectorLayerCache 类中以便⽤于构造
QgsAttributeTableModel 类。
接着分别创建 QgsAttributeTableView 和 QgsAttributeTableModel ⽤于显⽰属性表格
构造好 QgsAttributeTableModel ⼀定不要忘记加载⼀下图层,构造函数没有默认完成这个⼯作。
现在构建好的 QgsAttributeTableModel 不能直接与 QgsAttributeTableView 进⾏绑定,⽽是需要⼀个 Filter 在中间做“筛选”,因此需要⼀个 QgsAttributeTableFilterModel 来建⽴ QgsAttributeTableModel 和 QgsAttributeTableView 的之间联系。当然,不要忘记构造 QgsAttributeTableFilterModel 类还需要⼀个 QgsMapCanvas。
最后,将属性表格显⽰出来就好了
显⽰效果如下图:
测试代码照例,给出可运⾏的测试代码
QgsEditorWidgetRegistry::initEditors( mypMapCanvas  );
QString myLayerPath        = "D:/Data/qgis_sample_data/shapefiles/airports.shp"; // 修改这⾥
晚会结束语QString myLayerBaName    = "airports"; //图层名称;
QgsVectorLayer* mypLayer = new  QgsVectorLayer( myLayerPath, myLayerBaName, "ogr", fal  );
QgsVectorLayerCache* lc = new  QgsVectorLayerCache( mypLayer, mypLayer->featureCount() );
QgsAttributeTableView* tv = new  QgsAttributeTableView();
QgsAttributeTableModel* tm = new  QgsAttributeTableModel( lc );
tm ->loadLayer();
QgsAttributeTableFilterModel* tfm = new  QgsAttributeTableFilterModel( mypMapCanvas, tm, tm );tv->tModel( tfm );
tv ->show();
// main.cpp
#include<QtGui/QApplication>
#include<qgsapplication.h>
#include<qgsproviderregistry.h>
#include<qgssinglesymbolrendererv2.h>
#include<qgsmaplayerregistry.h>
#include<qgsvectorlayer.h>
#include<qgsmapcanvas.h>
#include<QString>
#include<QApplication>
#include<QWidget>
#include <QStringList>
#include<QMessageBox>
#include<QObject>
#include <QList>
#include <QFileInfoList>
#include <QDir>
#include <QLibrary>
生字偏旁#include <QDebug>
#include <qgsattributetableview.h>
#include <qgsattributetablemodel.h>
#include <qgsvectorlayercache.h>
#include <qgsattributetablefiltermodel.h>
#include "qgditorwidgetregistry.h"
int main( int argc, char *argv[] )
{
QgsApplication myApp( argc, argv, true );
QgsApplication::tPrefixPath( "C:/Program Files/qgis2.8.1", true );
QgsApplication::initQgis();
QgsProviderRegistry* provider = QgsProviderRegistry::instance();
QString myLayerPath        = "D:/Data/qgis_sample_data/shapefiles/airports.shp"; // 修改⽂件路径字符串    QString myLayerBaName    = "airports"; //图层名称;
QList<QgsMapLayer*> myList;
QgsVectorLayer* mypLayer = new QgsVectorLayer( myLayerPath, myLayerBaName, "ogr", fal ); if ( !mypLayer )
{
return0;
}
if ( !mypLayer->isValid() )
{
QMessageBox::information( 0, "", "layer is invalid" );
mypLayer->tProviderEncoding( "System" );
myList << mypLayer;
}
QgsMapLayerRegistry::instance()->addMapLayer( mypLayer );
QList<QgsMapCanvasLayer> myLayerSet;
myLayerSet.append( QgsMapCanvasLayer( mypLayer ) );
QgsMapCanvas* mypMapCanvas = new QgsMapCanvas( 0, 0 );
mypMapCanvas->tExtent( mypLayer->extent() );
萝卜叶子
mypMapCanvas->enableAntiAliasing( true );
mypMapCanvas->tCanvasColor( QColor( 255, 255, 255 ) );
mypMapCanvas->freeze( fal );
mypMapCanvas->tLayerSet( myLayerSet );
mypMapCanvas->tVisible( true );
mypMapCanvas->refresh();
/
/ 属性表格

本文发布于:2023-08-03 13:04:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1127680.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:属性   要素   表格   控件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图