寻找网站开发,黑龙江省建设安全协会网站,网业车资格证怎么报名,那个网站可以做图标这里实现两个基本的 GIS 软件需求#xff1a;矢量图层的属性表显示#xff0c;以及根据属性筛选要素。
具体需求如下#xff1a;
加载一个矢量图层并打开其属性表#xff1b;输入筛选条件确认无误后#xff0c;画布上和属性表中均只显示筛选后的要素。
QGIS 提供了若干…这里实现两个基本的 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(QListQgsMapLayer*() 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设置过滤表达式失败。);}}
}
1bool QgsVectorLayer::setSubsetString(const QString subset)
subset可以是sql语句的where子句也可以是特定于底层数据提供程序和数据存储的其他定义字符串。如果设置subset字符串成功则返回true否则返回false。QgsVectorLayer::setSubsetString()方法会将用户输入的subset应用到图层上筛选子句被设置成功后会自动映射到以其为源的数据缓冲即之前建立的 QgsVectorLayerCache 对象上。相应的数据源模型也将得到更改进而中间模型也会改最终反映到 QgsAttributeTableView 的显示上。
2const QgsVectorDataProvider * QgsVectorLayer::dataProvider()const
以正确的方式返回该层的数据提供程序它可能是nullptr。在获取和处理图层错误信息时需要通过QgsVectorLayer::dataProvider()方法获取QgsVectorDataProvider 类。这个类是对一切矢量数据源类型的抽象类似于数据处理的中间件。 3bool QgsVectorDataProvider::hasErrors()const
查询出现错误会返回true
4QStringList QgsVectorDataProvider::errors()const
获取记录的错误信息
5void QgsVectorDataProvider::clearErrors()
清除记录的错误信息
注意查询时输入的待查询的字符串要用单引号
参考文章 文章页 | mriiirons blog