当前位置: 代码迷 >> 综合 >> QListWidget 和 QListView的区别, (我花了3天去看源码)
  详细解决方案

QListWidget 和 QListView的区别, (我花了3天去看源码)

热度:38   发布时间:2023-12-27 14:58:15.0

    // 主要区别就是有木有自己的模型而已
    ①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