qt用类作为qlist的类型

qt用类作为qlist的类型,第1张

可棚扰以,与一般的类定义全局变量和静态变量一样用,QList有构造函数全局初始化:QListg_list静态变量用在类的静态成员变量倒是用到,全局静态变量基本没用链薯旦到。类的静态成员变量初始化:classA{staticQListm_list//这是定义手如}在类外边初始

QListView可以用来以列表的形式展示数据,在Qt中使用model/View结构来管理数据与视图的关系,model负责数据的存取,数据的交互通过delegate来实现。

使用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链接地址 。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11989880.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存