1. // 主要区别就是有木有自己的模型而已

①QListView

  1. 1.QListView继承于QAbstractItemView。<br /> 2.QListView提供数据模型和视图分开的操作方法。<br /> QListView仅仅封装了数据模型(QStandardItemModel)的基本操作功能。并不包含数据模型本身(QStandardItemModel)。<br /> 3.QListView中如果需要操作数据模型, 需要先调用统一的接口来给自己设置一个数据模型。<br /> 毕竟没有数据模型, 视图去操作什么呢?<br /> // QListView.setModel(QStandardItemModel *model);<br /> 4.QListView支持为模型(QStandardItemModel)中的某一个QStandardItem对象添加一个窗口对象索引,<br /> 这样就可以在某个item上显示一个窗口, 这使得继承他的子类QListWidget也具有该功能。<br /> (参阅笔记QListView)<br /> 5.QListView提供数据模型和视图分开的操作方法,功能强大,操作繁琐不适合菜鸟使用(但是我不是菜鸟)<br />

②QListWidget

  1. 1.QListWidget将视图和模型柔和在一起,使用户在item上显示窗口的操作更加简单。<br /> 但是他的功能就被局限于在item上显示窗口。<br /> 2.分析源码:看QListWidget是如何同时封装视图和数据模型二者的。<br /> 1.首先QListWidget继承于QListView,这就提供了视图的操作功能。<br /> 2.分析提供数据模型的过程<br /> 1. 增加一个itemQListWidgetItem对象<br /> class QListWidget : public QListView<br /> { inline void addItem(QListWidgetItem *item);<br /> }<br /> 2.QListWidgetItem类里面封装的是一个QVector<QWidgetItemData>容器,实现了<br /> QWidgetItemData“自关联子对象”的方法。(跟QStandardItem的实现一模一样)<br /> class QListWidgetItemPrivate<br /> { QVector<QWidgetItemData> values; <br /> } <br /> 3.QWidgetItemData里面是一个[角色类型, 对象]的结构体(跟QStandardItem的实现一模一样)<br /> class QWidgetItemData<br /> { int role;<br /> QVariant value;<br /> }<br /> 3.QListWidget继承于QListView,也支持(将一个窗口设置为某个item的索引窗口)的方法<br /> setIndexWidget(const QModelIndex &, QWidget *)<br /> 其实就是调用了QListView中的方法(和QListView是一样的)<br /> QAbstractItemView::setIndexWidget(index, widget); <br /> ③总结 <br /> 在很多情况下,只需要把一小部分的项呈现给用户,这就没必要使用model这样重量级的组件。<br /> 直接使用将数据模型和视图封装在一起的类QListWidgetQTableWidgetQTreeWidget<br /> (关于数据模型QStandardItemModel参考前面的笔记)<br />// 关于QListView的源码分析, 请参考我的博文: [https://blog.csdn.net/qq_38813056/article/details/88775196](https://blog.csdn.net/qq_38813056/article/details/88775196)<br />————————————————<br />版权声明:本文为CSDN博主「周厚平」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。<br />原文链接:[https://blog.csdn.net/qq_38813056/article/details/88804711](https://blog.csdn.net/qq_38813056/article/details/88804711)