Qt模型视图框架(三)

简介: Qt模型视图框架(三)

在上一篇文章中,小豆君介绍了QStandardItemModel的用法,并且了解了其储存单个数据项的QStandardItem类,而这些模型的层次结构,比如表格的行列,树结构的父子节点就需要一个类来进行定位,Qt中给它命名为QModelndex,字面意思上就是模型索引之意。

1 QModelndex

在软件接口设计中,要遵守的一个重要原则就是ISP(接口隔离原则),所以Qt为了确保数据的表示与访问方式保持隔离,引入了模型索引的概念。那么我们就可以将模型获得的每一块信息都用模型索引表示。

视图和委托使用这些索引来请求要显示的数据项。因此,只有模型才需要知道如何获取数据,并且模型管理的多种数据类型。

查看QAbstractListModel的接口,其所有接口都有一个共同的参数,就是QModelndex,所以有必要对这个类做一些详细介绍。

2 获取QModelndex方法

要获得对应于数据项的QModelndex,必须为QModelndex指定三个属性:行号、列号和父项的QModelndex,当我们知道了这三个属性,那么就可以找到数据项对应的QModelndex,从而对数据进行操控。

获取QModelIndex使用如下方法:

//参数:行号,列号,和其父节点的QModelIndex
QStandardItemModel::index(int  row, int  column, const QModelIndex& parent = QModelIndex()) const
//通过indexFromItem也可以获取索引,相对应的通过itemFormIndex可以获取item。
QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const
//通过QStandardItem的index接口可以获取QModelIndex
QModelIndex QStandardItem::index() const

2.1 根节点

在创建QStandardItemModel时会自动创建一个不可见的根节点,这个根节点用来作为所有可见顶层节点的父节点。

2.2 获取列表数据项索引

对于列表,只需要知道行号就可以获取索引。


QModelIndex idx = model->index(0, 0);//列号传入0即可

2.3 获取表格数据项索引

对于表格,其实是在行的基础上加上了列,如果将列理解成一维数据的展示,那表格可以理解为二维数据的展示,故在传入行号的同时,再传入列号就可以获取索引了。


QModelIndex idx = model->index(1, 2);//获取第2行第3列的数据,索引号都从0开始

2.4 获取树数据项索引

对于树,是在表格的基础上加上了层级结构,所以要再传入父节点的QModelIndex才可以获取索引。


QModelIndex indexA = model->index(0, 0, QModelIndex());//如果是顶层节点传入空的父节点索引即可
QModelIndex indexC = model->index(2, 1, QModelIndex());
QModelIndex indexB = model->index(1, 0, indexA);

3 item角色



模型中的item其实是由多个组件组成的,不同的组件可以显示不同的信息,比如显示文字,图标,复选框和提示信息。因此可用各种角色来匹配对应的组件,为不同的组件提供不同类型的数据。例如,Qt: DisplayRole用于访问可以在视图中显示为文本的字符串。这些标准角色由Qt::ItemDataRole定义。

4 总结

  • 通过QModelIndex可以获取item在视图和委托中的位置信息,并将该信息提供给模型。并且QModelIndex是独立于任何底层数据结构的。
  • item由它们的行和列号以及它们的父item的QModelIndex来引用。
  • QModelIndex是根据其他组件(如视图和委托)的请求由模型构建的。因此,QModelIndex是动态的,例如删除一个item,其后的item索引就会被更新。所以一般不要储存索引,而是要实时获取。
  • 模型中的根节点调用index接口返回的QModelIndex对象是无效的。

好了,关于今天的分享就到这里了,最后也希望大家多多支持小豆君的创作,关注公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,也可加入C++\Qt交流群,一起学习。

相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
112 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
7月前
|
开发框架 网络协议 数据库
Qt:构建跨平台应用的强大框架
Qt:构建跨平台应用的强大框架
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
147 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
WK
|
21天前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
51 5
|
7月前
|
存储 安全 Java
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
289 5
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
46 10
|
3月前
|
C语言 C++ Windows
QT多插件通信框架CTK编译记录
本文记录了编译QT多插件通信框架CTK的过程,包括编译结果截图、部署配置、Log4Qt编译配置、参考链接和拓展资料。文中提供了详细的编译步骤和配置文件示例,以及相关的资源链接。
QT多插件通信框架CTK编译记录
|
7月前
【qt】标准项模型1
【qt】标准项模型
40 0
|
7月前
|
开发框架 自然语言处理 Linux
Qt:构建强大跨平台应用程序的框架
Qt:构建强大跨平台应用程序的框架
|
6月前
|
编译器 C++
(10)Qt对象模型
(10)Qt对象模型

推荐镜像

更多