Learning Qt 5! (13):视图、委托和自定义模型

学完模型继续学习视图和委托。
Qt 学习之路 2(46):视图和委托
Qt 学习之路 2(47):视图选择
Qt 学习之路 2(48):QSortFilterProxyModel

自定义模型的例子们很好很强大,好好学习!
Qt 学习之路 2(49):自定义只读模型
Qt 学习之路 2(50):自定义可编辑模型
Qt 学习之路 2(51):布尔表达式树模型

视图不仅仅用于展示数据,还用于在数据项之间的导航以及数据项的选择。另外,视图也需要支持很多基本的用户界面的特性,例如右键菜单以及拖放。视图可以提供数据编辑功能,也可以将这种编辑功能交由某个委托完成。视图可以脱离模型创建,但是在其进行显示之前,必须存在一个模型。也就是说,视图的显示是完全基于模型的,这是不能脱离模型存在的。对于用户的选择,多个视图可以相互独立,也可以进行共享。

一个较完整的例子:基于QItemDelegate的例子1 SpinBoxDelegate

又如何在Qt中自己创建选择模型进行特殊的操作呢?要靠QItemSelectonModel。

Qt 使用QItemSelectionModel类获取视图中项目的选择情况。这个模型保持有项目的索引,并且独立于任何视图。这意味着,我们可以让不同的视图共享同一个选择模型,从来达到一种同步操作的目的。选择由选择区域组成。模型只将选区的开始和结束的索引位置记录下来,以保证对于很大的选区也有很好的性能。非连续选区则由多个连续选择组成。

一个参考:QtCreator 模块/视图编程( 二) 项目选择,QItemSelectionModel

再来了解一个用于数据筛选的类:QSortFilterProxyModel。

QSortFilterProxyModel并不能单独使用。顾名思义,它是一个“代理”,其真正的数据需要另外的一个模型提供。它的作用是对数据进行排序和过滤。排序很好理解,而过滤,则是按照输入的内容对数据及进行筛选,很像 Excel 里面的过滤器。不过 Qt 提供的过滤功能是基于正则表达式的,功能很强大。

Q&A:
1.如何在QTableView里面添加自定义的控件呢,不是createEditor,就是普通的显示,看起来应该是在paint()函数里面写,但是不知道如何绘制自定义的控件。

用于显示的组件可以通过自定义 delegate 实现。例如继承 QItemDelegate 或者 QStyledItemDelegate,重写其 paint() 函数。比如你想在里面添加一个按钮,就可以在 paint() 函数新建一个 QPushButton,然后用 QApplication::style()->drawControl() 把这个组件绘制出来。

猜你喜欢

转载自blog.csdn.net/u013213111/article/details/86252692