
使用Qt自带的模型类 QStandardItemModel 即可。模型中的每个数据项都有一个与之对应的role来存储某一类数据。需要存取自定义数据可以使用UserRole,UserRole+1...
对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。
模型的交互和绘制通过自定义delegate来实现,暂时没用到交互,先说下item的绘制。继承了QStyledItemDelegate后,重写paint函数处理item的样式,以及sizeHint函数返回item的大小:
在paint函数中,还可以获得当前item的状态,并设置不同的样式:
设置好模型后,再对QListView进行下属性设置:
模型的数据和展示都处理好后,运行效果如下:
Qt中提供了一个方便处理模型排序和过滤的类 QSortFilterProxyModel ,通过他可以非常方便的处理我们的model。将QListView展示的model设置成代理模型:
其中, m_proxyModel->setFilterRole(Qt::UserRole)设置根据模型的某一项数据来处理模型的过滤。proxyModel可以设置链弯过滤的方式,根据QString或者正则表达式来过滤:
对于列表中item的 *** 作,可以是在delegate中处理交互事件,也可以通过雹毕QListView获取到所有选中item的QModelIndex,然后对模型本源唤芹身进行修改。这里我选择的后者:
将QListView的 selectionBehavior 设置成 MultiSelection 即可。
对于多选的时候,模型的修改有一个坑。在设置了代理模型后,由于开启了动态排序模式,如果修改代理模型的数据,在第一个item修改数据后可能就不在当前过滤模型中,会被过滤掉,后面的item的QModelIndex就会变化,导致后续的修改失败。
有两个方法处理这个坑,一是不修改代理模型,修改源模型的数据。二是在修改模型数据的时候关闭代理模型的动态排序功能。
弄完大概是酱紫的:
Demo在这里:->Github链接地址 。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)