QT的模型/视图

Qt的mvc模式实际上是mvd,即model:管理数据抽象;view: 负责图形界面的展示or刷新;delegate:负责图像界面的操作

1 常用model: QAbstractItemModel、QStringListModel、QStandardItemModel 标准模型、QFileSystemModel 文件系统模型、QAbstractTableModel 表格模型
接口说明:
updateData
主要用于更新数据,刷新界面
data
用来显示数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要显示的内容。
setData
用来设置数据,根据角色(颜色、文本、对齐方式、选中状态等)判断需要设置的内容。
headerData
用来显示水平/垂直表头的数据。
flags
用来设置单元格的标志(可用、可选中、可复选等)。
// 利用flags设置表格可选中、可复选
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return QAbstractItemModel::flags(index);

Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;

return flags;

}

2 特殊model QSortFilterProxyModel
QSortFilterProxyModel是用来排序和过滤的,不能单独使用,它只是一个“代理”,真正的数据需要QAbstractTableModel提供,可以重写lessThan来实现自己的排序算法。lessthan通过设置左右值对比法则,返回true表示左值序号比右值小,从而排在前,默认升序。
如果想使用QSortFilterProxyModel用于数据过滤,一般有两种方法,一是使用setFilterKeyColumn()过滤列,另一种则是重写filterAcceptsRow成员函数

3 常用view:QAbstractItemView、QTableView 表格视图、QTreeView 树形结构试图

4 实例:
4.1 在table中添加复选框
4.1.1 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。
此功能用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。
4.1.2 自定义模型QAbstractTableModel,通过flags()函数来实现。
方式:通过将flags()设置为Qt::ItemIsUserCheckable实现可选中,然后配合setData()与data()来实现。
特点:直接显示,可定义样式,默认左对齐,很难实现居中、右对齐。
4.1.3 自定义委托QAbstractItemDelegate,通过paint()函数来实现。
方式:通过控制editorEvent()实现鼠标的点击进行全选/半选/不选,然后由paint()实时绘制。
特点:这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以绘制其它控件-按钮、图片等。
4.1.4 利用委托重载createEditor(),激活QCheckBox。
特点:必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。

posted @ 2022-03-07 16:29  Deadrock  阅读(388)  评论(0)    收藏  举报