Qt学习笔记-----Model/View架构之自定义Model

QTableView效率优化2 - 自定义Model秒级加载百万行数据 在前文中,对于QStandardItemModel的效率进行了部分优化,https://blog.youkuaiyun.com/qq_37996632/article/details/123427832?spm=1001.2014.3001.5501,几万行以内的数据,QStandardItemModel还是非常好用的,直接有Qt写好的大量现成接口。也正是因为QStandardItemModel和QStandardItem包含的东西过多,不够简洁,所以在十万行级别的大量数据时QStandardItemMode... 阅读详情

作者:一个程序渣渣的小后院 地址:http://blog.youkuaiyun.com/sinat_35261315/article/details/54849486

Model/View Framework中提供了模型model的抽象基类QAbstractItemModel, 如果需要自定义模型就需要继承这个类并且实现一些必要的函数。 
此外,Qt中又提供了QAbstractTableModel和QAbstractListModel分别继承于上述基类,由名字可以清楚的知道这两个类分别适用于表格模型和列表模型。对于这两个模型来说,很多函数已经重新实现过了,使用时直接继承即可。

QAbstractItemModel 
QAbstractItemModel为元素模型类提供了抽象接口,自定义模型时需要继承这个类。自定义的模型分为只读模型和可编辑模型。

只读模型:内部数据不能修改 
为了实现一个只读模型,需要重新实现以下函数:

flags

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
  • 1
  • 1

这个函数返回被给模型索引index的标志,用于其他组件获得每一个元素的信息。在很多模型中,返回的flags应该包括Qt::ItemIsEnabled和Qt::ItemIsSelectable,表示模型中的元素是可以被访问和选择的。通常实现的形式为:

if(!index.isValid())
    return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

data

QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
  • 1
  • 1

这个函数返回模型索引index的底层数据(一个模型索引包括某一元素的信息,包括行,列,以及数据),用于视图和委托访问数据。通常的实现形式如下:

if(!index.isValid())
    return QVariant();
if(index.row() >= /*数据总个数*/)
    return QVariant();
if(role == Qt::DisplayRole)
{
    int row = index.row();
    int column = index.column();
    //根据模型存储数据所用的数据结构来返回对应行和列的数据
    return /*数据*/
}
return QVariant();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

headerData

QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role == Qt::DisplayRole) const
  • 1
  • 1

这个函数返回某部分对应方向上的表头,为Views提供显示在Views顶部(即最上方和最左边)的标识。通常实现形式为:

if(role != Qt::DisplayRole)
    return QVariant();
if(orientation == Qt::Horizontal)//headersData在最上方,水平方向
或if(orientation == Qt::Vertical) //headersData在最左边,垂直方向
{
    //判断section,section表示的是第几个
    return ...
}
return QVariant();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

rowCount

int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const
  • 1
  • 1

这个函数返回被给的模型索引下有多少行,返回的是parent的孩子数。而不是整个行数。如果没有子元素,则返回0。

对于继承于QAbstractListModel的类来说,只需要重新实现这四个函数。而对于继承于QAbstractTableModel和QAbstractItemModel的类来说,除了上述四个函数,还需要重新实现columnCount函数,因为列表只有1列,而表格和树则需要自定义:

columnCount

int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const
  • 1
  • 1

这个函数通常与给定的parent无关,所涉及的类有几列就返回几。

可编辑模型:允许数据被修改,也可以允许插入和删除操作。

实现可编辑模型,除了上述只读模型的函数外,还需要重新实现以下函数:

flags

Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex &index) const
  • 1
  • 1

这个函数和只读模型的函数一样,只是返回时需要增加Qt::ItemIsEditable,形式如下:

if(!index.isValid())
    return Qt::ItemIsEnabled;
return QAbstractItemModel::flags(index) | Qt::ItemIsEditabled;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

setData

bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
  • 1
  • 1

data函数用来获取数据,setData函数用来设置模型索引index中存储的数据,形式如下:

if(index.isValid() && role == EditRole)
{
    int row = index.row();
    //根据行号从内部数据结构中定位,然后将其改编成value
    emit dataChanged(index, index);
    return true;
}
return false;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

另外需要注意的是,在改变完内部数据后,需要发出dataChanged(index, index)信号通知Views和Delegate内部数据已经发生改变。

setHeaderData

bool QAbstractItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)
  • 1
  • 1

headerData函数用于返回表头,这个函数设置表头为value,形式如下:

if(role != EditRole)
    return false;
if(orientation == Qt::Horizontal) 或 if(orientation == Qt::Vertical)
{
    //改变存储表头的变量
    emit headerDataChanged(orientation, section, section);
    return true;
}
return false;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同样,当改变表头后,需要发出headerDataChanged(orientation, section, section)信号,通知Views和Delegate。

如果需要添加和删除操作,则需要实现以下函数: 
insertRows

bool QAbstractItemModel::insertRows(int position, int rows, const QModelIndex &index = QModelIndex())
  • 1
  • 1

这个函数在父级为index的结构中的第position行插入rows行。形式如下:

beginInsertRows(index, position, position + rows - 1);
//内部变量进行删除操作
endInsertRows();

return true;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

进行插入操作时,前后分别需要调用beginInsertRows()和endInsertRows()函数。

removeRows

bool QAbstractItemModel::removeRows(int position, int rows, const QModelIndex &index = QModelIndex())
  • 1
  • 1

这个函数在父级为index的结构中的第position行删除rows行。形式如下:

beginRemoveRows(index, position, position + rows - 1);
//内部变量进行删除操作
endRemoveRows();
return true;
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

进行删除操作时,前后需要调用beginRemoveRows()和endRemoveRows()函数。

insertColumns 
removeColumns 
这两个函数同插入行和删除行类似,也需要调用两个函数。

通常情况下,函数应该返回true如果操作成功,但是如果只是部分操作成功,例如只插入了部分行,则需要返回false。

例子:http://qimo601.iteye.com/blog/1534331
Qt Model/View 学习(5) - QTableView(优雅)使用教程(附源码) QTableView的优雅使用教程~View只管“表面工作”,而将数据交给Model! 阅读详情

相关推荐

QT学习笔记-Qt Model/View

目录前言一、Qt模型视图结构简介二、Qt模型概念Model indexes行列父项**数据项角色**三、Qt视图概念使用已有视图使用模型操作被选项四、Qt委托使用已有委托一个简单的自定义委托五、创建模型设计模型 前言 因工作需要,要实现一个小型的数据管理系统。本着想捡起来QT技能的想法,学习下QT模型视图的操作。 一、Qt模型视图结构简介 模型/视图结构,仍然分离了数据与呈现给用户的方式,但提供了基于相同原理的简单框架。这种分离使得它可以在几个不同的视图中显示相同的数据,并且实现新类型的视图,而无需改变

kouqi627的博客 6305

Qt 模型视图编程之增删行列

Qt 自定义数据模型-增删模型行列

编程猿来如此 4005

Qt之Model/View架构

Qt中的Model/View架构摘要 Model/View是Qt中用于分离数据和视图展示的设计模式,源于MVC架构的简化。该架构由三个核心组件组成: Model - 管理数据,提供标准接口 View - 显示数据 Delegate - 处理数据项的渲染和编辑 主要特点: 支持多种视图展示同一数据源 适合处理大量结构化数据 内置排序、过滤和编辑功能 通过委托可自定义显示和编辑方式 适用场景: 需要多种方式展示相同数据时 处理大数据量或动态数据时 需要复杂的数据展示和编辑功能时

Mei20140912的专栏 880

QT自定义QTableView的Model/View

QAbstractTableModel

紫藤的专栏 8745

Qt Model/View/Delegate 架构深度解析

摘要:Qt模型/视图/委托架构通过分离数据与表现实现高效GUI开发。核心组件包括:Model负责数据管理,View负责可视化展示,Delegate控制渲染和编辑方式。该架构支持一份数据多种展示,具有高性能和高度可定制的特点。文中以学生成绩管理系统为例,演示了如何自定义模型(StudentModel)存储学生数据,使用委托(ScoreDelegate)实现分数列的特定编辑逻辑,并通过QTableView和QListView同时展示同一份数据,实现数据修改的实时同步。这种设计模式显著提升了Qt应用的灵活性、扩展

2401_82978699的博客 1232

Qt学习笔记-----Model/View架构

为了实现数据的存储和表现分离,Qt提供了Model/View架构,包括三个部分,分别是模型(Model),视图(View),委托(delegate)。 Model用于访问底层数据,也就是说为其他组件访问存储的数据提供了接口。 View通过Model Index来获取底层的数据,将数据绘制到窗体上。 Delegate是在View需要编辑的时候提供一种自定义编辑方式。比如我们可能只允许输入数字,

一个程序渣渣的小后院 3536

Qt Model/View编程介绍

Qt中包含了一系列的项视图类,它们使用model/view的架构去管理数据之间的关系以及它们被展示给用户的方式。这种由这种架构引进的功能分离特性给了开发者很大的灵活性去自定义自己的展示方式,并且提供了一个编制的模型接口以使很多种的数据源都可以和现存的视图相结合。

9386

【QT】Model/View结构

本文介绍Model/View(模型/视图)结构,主要涉及Model/View基本原理、数据模型、视图组件、代理等相关概念

u011671745的博客 1961

Qt Model/View教程

目录   每个UI开发人员都应该了解Mode/View编程,本教程将对Model/View进行全面的介绍。   表(Table)、列表(List)和树(Tree)控件是gui中经常使用的控件。这些控件访问数据的方式有两种。比较传统的方法是控件包含一个用于存储数据的内部容器。这种方法非常直观,但是,在许多重要的应用程序中,它会导致数据同步问题。第二种方法是Model/View编程,其中控件不维护内部...

亅会飞的乌龟的博客 6971

Qt 中model/View 架构 详解,以及案例实现相薄功能

fill:#333;color:#333;color:#333;fill:none;**QAbstractItemDelegate:**中含有2个纯虚函数编号 01 函数Model 项数据在View进行绘画的函数,具体绘画功能在此实现。编号02 函数Model 项数据在View 进行绘画的区域大小。return;reset();

weixin_42252757的博客 1691

Qt基础之六:Model/View架构

模型/视图是一种用于从视图中分离数据的技术。标准widgets不是为从视图中分离数据而设计的,这就是为什么Qt有两种不同类型的widgets。这两种类型的widgets看起来相同,但它们与数据的交互方式不同。☆标准widgets的数据是widgets的一部分☆Model/Viewwidgets操作View外部的数据(model)......

草上爬的博客 7088

Qt扫盲-Qt Model/View 理论总结 [上篇]

Qt 包含了一组 item view类,它们使用 model / view 架构来管理数据之间的关系以及呈现给用户的方式。该体系结构引入的功能开发人员提供了更大的灵活性来自定义表现形式,而且这个框架还提供了一个标准的model 接口,以允许广泛的数据源与现有 item 目 View 一起使用。在本文中,我们简要介绍了 model / view 编程概念,概述了所涉及的概念,并描述了 item 目View系统的体系结构。对架构中的每个组件都进行了解释,并给出了如何使用所提供的类的示例。

洪源兄 2627

QT表格自定义model,支持代理控件

QT表格自定义model,支持代理控件(代码里有示例),高性能刷新,支持大量数据上表,觉得好用的同学评论点赞

Qt Model/View框架详解1

Model/View框架中,Model提供一种标准接口,供视图和委托访问数据。QT中,Model接口由QAbstractItemModel类进行定义。不管底层数据是如何存储的,只要是QAbstractItemModel的子类,都提供一种表格形式的层次结构。视图利用统一的转换来访问模型中的数据。模型内部数据的组织方式并不一定和视图中数据的显示相同。List Model虽然是线性的列表,有一个 Root Item(根节点),线性的一个个数据可以看作是一个只有一列的表格,但是它是有层次的,因为有一个根节点。

m0_73482095的博客 2379

多传感器标定全栈系统学习教程

无论是激光雷达(Lidar)、毫米波雷达(Radar)、相机(Camera)还是惯导(IMU),传感器之间的精确标定直接决定了系统的可靠性与性能。本文将以系统化的视角,梳理多传感器标定的核心知识体系,并分享一套覆盖全栈技术的学习路径。Calibration)是实现点云与图像融合的前提,而雷达与车辆的标定(Radar2Car)则是精准速度估计的关键。:Lidar2Car、Camera2Car的快速标定流程,标定板布置规范。:从单传感器标定入手(如相机内参),逐步过渡到多传感器联合标定。

weixin_41792788的博客 904

深交所 vs 上交所:Level-2实时数据推送规则详解与策略适配指南

本文深度解析沪深Level-2实时数据推送规则的关键差异,包括逐笔成交、逐笔委托和10档行情接口的处理逻辑。针对高频交易策略,详细对比上交所与深交所在数据推送机制、时间戳处理及委托队列解析等方面的差异,并提供具体的策略适配方案和性能优化建议,帮助量化投资者提升跨市场交易稳定性。

weixin_27310417的博客 1165

PyQt4学习笔记2】Qt 的 Model/View 架构

文章详细介绍了Qt 的 Model/View 架构

look_outs的博客 1750

QMT实盘交易入门:5分钟搞定ETF全球配置策略(附完整代码)

本文详细介绍了如何使用QMT平台实现ETF全球配置策略,从环境准备到策略编写、实盘部署全流程仅需5分钟。通过xtquant库对接交易所接口,提供完整的动量轮动策略代码,帮助投资者快速掌握自动交易技术,优化全球资产配置。

weixin_30675247的博客 334

Qt Model/View 编程深度解析报告

本文介绍了Qt框架中的Model/View架构,该架构通过分离数据与视图解决了传统GUI开发中的数据冗余和同步问题。文章首先分析了传统基于项控件的局限性,指出其数据耦合导致的维护成本上升。随后阐述了Model/View对MVC模式的改进,合并视图和控制器角色并引入委托机制,形成了Model/View/Delegate范式。 核心内容围绕三大组件展开: 模型作为数据抽象层,通过QAbstractItemModel标准接口统一访问各类数据源,提供QAbstractListModel和QAbstractTable

greenspan的专栏 2180

SoapUI 5.0 模拟WebService接口实战:从WSDL文件到Mock服务端完整流程

本文详细介绍了如何使用SoapUI 5.0模拟WebService接口,从解析WSDL文件到搭建完整的Mock服务端流程。通过实战案例和效率技巧,帮助开发者快速掌握接口模拟技术,提升开发与测试效率。

weixin_26833139的博客 407

记一次在JAVA中客户端使用axis调用webservice服务端出现的异常:Unmarshalling Error: For input string: ""

在使axis调用webservice服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet

kry1201的专栏 8080

QT MVC 编程 MODEL/DELEGATE/VIEW(一)

MVC架构通过数据、视图分离能够带来性能的显著提升以及高度的灵活性,Qt提供了一种略微不同于MVC(Model-View-Controller)的架构,称之为MVD(Model-View-Delgate)架构。即Controller实际上应由用户自己组合实现,Qt未提供专门的类来处理,Qt提供了一系列的Delegate协调Model和View,实现渲染、数据编辑和转换,不直接参与界面布局,而是与View配合进行细节控制以及将Model数据转换为View可用的格式。

cnbizz的专栏 873

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头:拍摄身份证的正反面,自定义身份证取景框,在相机上绘制“身份证轮廓“与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 1万+
上一篇: (四十三)信号与槽再探
下一篇: C++ Heap corruption detected 报错!!!
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值