设为首页 加入收藏

TOP

[Qt基础内容-08] Qt中MVC的M(Model)(一)
2023-07-23 13:30:03 】 浏览:135
Tags:-08 MVC Model

Qt中MVC的M(Model)简单介绍

Qt有自己的MVC框架,分别是model(模型)、view(视图)、delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基本的使用。
Qt官方的文档已经很详细了,如果想要详细的去了解,建议花点精力去看官方文档。

@

类继承的结构

Qt中的模型类,都继承自QAbstractItemModel,这个类定义了基本的必须的接口。

由于QAbstractItemModel这种带有abstract的类是抽象类,不建议直接使用,所以本文只介绍可直接使用的类的基本用法。

QStringListModel

根据Qt帮助文档中的解释,QStringListModel是一个可编辑的模型,可用于需要在视图小部件(如QListView或QComboBox)中显示许多字符串的简单情况。
下面是使用的代码以及效果展示:

QStringListModel *m_listModel_2 = new QStringListModel;
QStringList list_2  = {"111", "222", "333", "444", "555"};
m_listModel_2->setStringList(list_2);

ui->listView->setModel(m_listModel_2);

展现的效果:
PluginForMyDemo_kYnZ78Hcsa.png

QAbstractProxyModel

??这里有一个Proxy(代理),这个要和Delegate(委托)区分开来。我的理解是,Proxy(代理)主要是应用在model上,用于对原数据进行处理,而Delegate(委托)主要是用来显示和编辑数据。
??为什么要有这个代理呢?个人理解是,当Model关联了几个View时,如果你需要对某一个Model的数据进行排序,那如果不用代理,那么就意味着你原本的Model也会改变,那么所有的View都会改变。那么如果你仅仅只需要当前的view对这个数据进行改变,那么就需要用到代理,帮你把内容进行一个处理,然后发出来。


QSortFilterProxyModel

这个代理,提供了排序和过滤的接口,能够方便的调用,给数据提供一个排序过滤的功能;
根据Qt官方帮助文档对于QSortFilterProxyModel的介绍:

QSortFilterProxyModel can be used for sorting items, filtering out items, or both. The model transforms the structure of a source model by mapping the model indexes it supplies to new indexes, corresponding to different locations, for views to use. This approach allows a given source model to be restructured as far as views are concerned without requiring any transformations on the underlying data, and without duplicating the data in memory.


QSortFilterProxyModel 可用于排序项目、过滤项目或两者兼而有之。 该模型通过将其提供的模型索引映射到新索引(对应于不同位置)来转换源模型的结构,以供视图使用。 这种方法允许就视图而言对给定的源模型进行重构,而无需对基础数据进行任何转换,也无需复制内存中的数据。

以下是基本的用法:

  1. 排序

    QTableView* tableview = new QTableView();
    
    QStandardItemModel *model = new QStandardItemModel();
    model->setItem(0, 0, new QStandardItem("Aba"));
    model->setItem(1, 0, new QStandardItem("aba"));
    model->setItem(2, 0, new QStandardItem("ABc"));
    model->setItem(0, 1, new QStandardItem("C"));
    model->setItem(1, 1, new QStandardItem("A"));
    model->setItem(2, 1, new QStandardItem("c"));
    model->setItem(0, 2, new QStandardItem("c"));
    model->setItem(1, 2, new QStandardItem("b"));
    model->setItem(2, 2, new QStandardItem("C"));
    
    QSortFilterProxyModel* sortFilterModel = new QSortFilterProxyModel();
    // 为代理设置源model
    sortFilterModel->setSourceModel(listModel);
    // 设置大小写敏感
    sortFilterModel->setSortCaseSensitivity();
    
    tableview->setModel(sortFilterModel);
    // 设置开启点击表头进行排序
    tableview->setSortingEnable(true);
    

    ??需注意的是,当你使用QTableView或者QTreeView时,调用setSortingEnable并设置为true,就可以设置点击表头进行排序。
    image.png
    当然,你可以手动进行排序

    // 对第二列进行升序排序
    ui->tableview->sortByColumn(1, Qt::AscendingOrder);
    

    ??但是这样排序有一个问题:表的序号没有进行改变。暂时没有找到方法来解决,有一个参考的解决方法可以看:QTableView自定义Model实现排序 。同样,如果你要自定义排序的规则的话,你可以继承QSortFilterProxyModel类,然后重写lessThan函数,重新写一下里面的排序规则。可以参考Qt官方的例子Cus

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++|STL 下一篇C++ 由快排学习到的的随机数等知识

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目