【Qt之模子视图】1. 模子和视图架构

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

1. 模子/视图架构是什么及有什么用


  • MVC(Model-View-Control)是一种源自Smalltalk的设计模式,通常用于构建用户界面。
    MVC由三种范例的对象构成。模子是应用对象,用来表现数据;视图是模子的用户界面,用来显示数据;控制器界说了用户界面临用户输入的反应方式。在MVC之前,用户界面设计每每将这些对象混为一谈。MVC将它们解耦,以增加机动性和重用性。
    在之前,大概编程就是,在一个类中,将UI、Data、尚有整个控制都写在一起,耦合高,欠好拆分。当将之前编写的模块引入到新的项目中时,该模块大概会有很多新项目用不到的内容,还需要手动删除,删除中还会碰到各种问题。
  • 假如将视图和控制器对象归并,就会得到模子/视图架构。这仍旧将数据存储与呈现方式分离,但提供了一个基于雷同原则的更简朴的框架。这种分离使得可以在多个差别视图中显示雷同的数据,并且可以实现新范例的视图,而无需更改底层数据结构。为了实现对用户输入的机动处理,引入了委托的概念。在该框架中,使用委托的利益在于可以自界说数据项的渲染和编辑方式。
  • Qt库提供了很多预界说的模子和视图类,如QStandardItemModel、QListView、QTableView等,开辟职员可以根据自己的需求选择符合的类来创建模子和视图。同时,开辟职员也可以自界说模子和视图类来适应特定的应用场景。
模子/视图,如下所示:

2. 数据的存储方式可以是多样化的

数据自己并不肯定存储在模子中,可以储存在一个数据结构,或者一个文件,一个数据库,或者其他组件中,都是有大概的。
如:一个数据范例,QStringList
  1. QStringList sl;
  2. sl << QString("1") << QString("2") << QString("3") << QString("4") << QString("5") << QString("6");
复制代码
假如视图是列表,那sl可以显示为6行1列;假如视图为表格,则根据表格行列,可显示为对应的视图;但数据还是那个数据,不变。
3. 架构构成部门

一般来说,模子/视图架构可以分为3类:模子、视图和委托。
在Qt中,每个类都有一个抽象基类来界说,提供了一些通用接口和一些功能的默认实现;抽象类呢,就允许编写自界说的组件。
其中,这三者之间的交互是通过信号和槽来实现:


  • 当数据源中的数据变化时,模子发出信号关照视图;
  • 当用户与显示的项目交互时,视图发出信号提供交互信息;
  • 当编辑项目时,委托发出信号,关照视图和模子其状态。
3.1 模子

检察其手册,发现全部模子类的基类都是QAbstractItemModel类。
该类提供了一些接口,用于让视图和委托访问数据。
QAbstractItemModel提供了一个机动的数据接口,可以处理以表格、列表和树形形式表现数据的视图。
但是,当为列表和雷同表格的数据结构实现新模子时,可以继续至QAbstractListModel和QAbstractTableModel类,因为它们提供了列表和表格等常用的一些函数。每个类都可以被子类化,以提供支持特别范例的列表和表格的模子。
Qt提供了一些现成的模子,可以用来处理数据项:


  • QStringListModel 用于存储简朴的 QString 项列表。
  • QStandardItemModel 管理更复杂的树形结构的项,每个项可以包罗恣意数据。
  • QFileSystemModel 提供关于本地文件系统中的文件和目次的信息。
  • QSqlQueryModel、QSqlTableModel 和 QSqlRelationalTableModel 用于使用模子/视图约定访问数据库。
假如这些标准模子不满足需求,可以子类化 QAbstractItemModel、QAbstractListModel 或 QAbstractTableModel 来创建自界说模子。
3.2 视图

Qt提供了几种差别范例的视图:


  • QListView将数据项显示为一个列表;
  • QTableView在表格中显示模子的数据;
  • QTreeView以分层列表的形式显示模子的项目数据。
这些类都是基于QAbstractItemView抽象基类。这些类可以直接使用,也可以通过子类化来提供自界说视图。
3.3 委托

QAbstractItemDelegate是模子/视图框架中委托的抽象基类。QStyledItemDelegate提供了默认的委托实现,并且被Qt的标准视图用作默认的委托。但是,QStyledItemDelegate和QItemDelegate是独立存在的,只能选泽其中一种为视图中的项目绘制和提供编辑器。它们之间的区别在于QStyledItemDelegate使用当前的样式来绘制其项目。因此,当实现自界说委托或使用Qt样式表时,发起将QStyledItemDelegate作为基类使用。
4. 示例

以上说了MVC的作用及模子、视图、委托的介绍,下面是一个示例举行简朴阐明。
QFileSystemModel类为本地文件系统提供了一个数据模子,自己不包罗任何的数据,它代表了本地文件系统中的文件和目次。
该类提供对本地文件系统的访问,提供了重命名和删除文件和目次的功能,以及创建新目次的功能。在最简朴的情况下,它可以与得当的显示部件一起用作欣赏器或筛选器的一部门。
QFileSystemModel可以使用QAbstractItemModel提供的标准接口访问,但它还提供了一些特定于目次模子的方便函数。fileInfo()、isDir()、fileName()和filePath()函数提供了与模子中项目相关的底层文件和目次的信息。可以使用mkdir()和rmdir()函数创建和删除目次。
QFileSystemModel类可以和QListView或QTreeView一起用来显示内容。
  1. #include <QDir>
  2. #include <QTreeView>
  3. #include <QListView>
  4. #include <QFileSystemModel>
  5. #include <QDebug>
  6. MainWindow::MainWindow(QWidget *parent) :
  7.     QMainWindow(parent),
  8.     ui(new Ui::MainWindow)
  9. {
  10.     ui->setupUi(this);
  11.     QListView* pLV = new QListView();
  12.     QTreeView* pTW = new QTreeView(this);
  13.     QFileSystemModel* pModel = new QFileSystemModel(this);
  14.     pTW->setModel(pModel);
  15.     pModel->setRootPath(QDir::currentPath());
  16.     pTW->setRootIndex(pModel->index(QDir::currentPath()));
  17.     setCentralWidget(pTW);
  18.     pLV->setModel(pModel);
  19.     pLV->setRootIndex(pModel->index(QDir::currentPath()));
  20.     pLV->show();
  21. }
复制代码


同一个模子,根据视图差别,显示差别的方式;由此可看到模子/视图的利益。
5. 结论

假如是大量数据显示,或者想有更高的控制权,发起使用View/Model。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表