// 主要区别就是有木有自己的模型而已
①QListView
1.QListView继承于QAbstractItemView。
2.QListView提供数据模型和视图分开的操作方法。
QListView仅仅封装了数据模型(QStandardItemModel)的基本操作功能。并不包含数据模型本身(QStandardItemModel)。
3.QListView中如果需要操作数据模型, 需要先调用统一的接口来给自己设置一个数据模型。
毕竟没有数据模型, 视图去操作什么呢?
// QListView.setModel(QStandardItemModel *model);
4.QListView支持为模型(QStandardItemModel)中的某一个QStandardItem对象添加一个窗口对象索引,
这样就可以在某个item上显示一个窗口, 这使得继承他的子类QListWidget也具有该功能。
(参阅笔记QListView)
5.QListView提供数据模型和视图分开的操作方法,功能强大,操作繁琐不适合菜鸟使用(但是我不是菜鸟)
②QListWidget
1.QListWidget将视图和模型柔和在一起,使用户在item上显示窗口的操作更加简单。
但是他的功能就被局限于在item上显示窗口。
2.分析源码:看QListWidget是如何同时封装视图和数据模型二者的。
1.首先QListWidget继承于QListView,这就提供了视图的操作功能。
2.分析提供数据模型的过程
1. 增加一个item是QListWidgetItem对象
class QListWidget : public QListView
{ inline void addItem(QListWidgetItem *item);
}
2.QListWidgetItem类里面封装的是一个QVector<QWidgetItemData>容器,实现了
QWidgetItemData“自关联子对象”的方法。(跟QStandardItem的实现一模一样)
class QListWidgetItemPrivate
{ QVector<QWidgetItemData> values;
}
3.QWidgetItemData里面是一个[角色类型, 对象]的结构体(跟QStandardItem的实现一模一样)
class QWidgetItemData
{ int role;
QVariant value;
}
3.QListWidget继承于QListView,也支持(将一个窗口设置为某个item的索引窗口)的方法
setIndexWidget(const QModelIndex &, QWidget *)
其实就是调用了QListView中的方法(和QListView是一样的)
QAbstractItemView::setIndexWidget(index, widget);
③总结
在很多情况下,只需要把一小部分的项呈现给用户,这就没必要使用model这样重量级的组件。
直接使用将数据模型和视图封装在一起的类QListWidget、QTableWidget、QTreeWidget
(关于数据模型QStandardItemModel参考前面的笔记)
// 关于QListView的源码分析, 请参考我的博文: https://blog.csdn.net/qq_38813056/article/details/88775196
QListWidget 和 QListView的区别, (我花了3天去看源码)
最新推荐文章于 2024-07-07 17:22:59 发布