#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,这里也需要设置编码为utf8
mpVectorLayer->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();
// 设置的同时会进行查询,如果查询出现错误则返回false
if (!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"设置过滤表达式失败。");
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
这里实现两个基本的 GIS 软件需求:矢量图层的属性表显示,以及根据属性筛选要素。 具体需求如下: 1、加载一个矢量图层并打开其属性表; 2、输入筛选条件确认无误后,画布上和属性表中均只显示筛选后的要素。 属性表基于 Qt 的 QTableView 实现,利用了 QT中的Model/View 机制。 本篇文章主要用到的与实现图层属性表相关的类有四个,分别为: QgsVectorLayerCache,用于缓存给定QgsVectorLayer的特征,缓存的特征可以通过QgsAbstractCacheIndex进行索引。 QgsAttributeTableModel ,它能够为QAbstractItemView提供特征/属性信息,作为QgsAttributeTableView的后端数据源。 QgsAttributeTableView,该类继承自QgsTableView,进而继承自QTableView,是最终显示图层属性表的视图组件。 QgsAttributeTableFilterModel,继承自QSortFilterProxyModel提供对源模型数据筛选和排序的能力。
资源推荐
资源详情
资源评论
收起资源包目录
qgis04_AttributeTable.rar (30个子文件)
qgis04_AttributeTable
qgis04_AttributeTable.sln 1KB
qgis04_AttributeTable
DefMainWindow.h 1KB
qgis04_AttributeTable.vcxproj.filters 1KB
mainWindow.ui 2KB
symbology-style.db 92KB
DefMainWindow.cpp 4KB
qgis04_AttributeTable.vcxproj 5KB
user-history.db 16KB
qgis04_AttributeTable.vcxproj.user 429B
main.cpp 516B
x64
Debug
vc141.pdb 4.81MB
vc141.idb 1.29MB
qgis04_AttributeTable.log 132B
DefMainWindow.obj 599KB
main.obj 404KB
qgis04_A.cf5ce55e.tlog
CL.write.1.tlog 2KB
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 770B
qgis04_AttributeTable.lastbuildstate 209B
CL.read.1.tlog 135KB
mainWindow.h 4KB
.vs
qgis04_AttributeTable
v15
Browse.VC.db 27.35MB
.suo 49KB
ipch
AutoPCH
5a565af400955375
MAIN.ipch 168.25MB
bf7ba8716e7efb26
DEFMAINWINDOW.ipch 169.25MB
x64
Debug
qgis04_AttributeTable.exe 203KB
qgis04_AttributeTable.pdb 2.03MB
qgis04_AttributeTable.ilk 2.22MB
共 30 条
- 1
资源评论
程序员班长
- 粉丝: 6520
- 资源: 31
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功