导言:
当遇到一个相对复杂的项目软件的时候,处理的数据量相对较大,这时候从软件设计的角度,一般都会考虑运用模型视图的架构。
Qt关于MVC编程组成部分:
大体上,模型、视图架构中众多类可以分为3组:模型、视图和委托。它们之间使用信号和槽来实现通信。
1 模型
所有的模型都基于QAbstractItemModel为数据提供了一个十分灵活的接口来处理各种视图,这些视图可以将数据表现为表格(table)、列表(list)和树(tree)等形式。
QAbstractListModel 和QAbstractTableModel类,提供了一些常见的功能。
Qt提供了一些现成的模型来处理数据项:
QStringListModel 用来存储简单的QString项目列表;
QStandardItemModel管理复杂的树形结构数据项,每一个数据项可以包含任意的数据;
QFileSystemModel提供了本地文件系统和目录的信息;
QSqlQueryModel、QSqlTableModel和QSqlRelationalTableModel用来访问数据库。
如果Qt提供的这些标准的模型无法满足需要,还可以子类QAbstractItemModel、QAbstractListModel 或者QAbstractTableModel来创建自定义的模型。
2 视图
Qt 提供了几种不同类型的视图,
-
QListView将数据项显示为一个列表;
QTableView将模型中的数据显示在一个表格中;
QTreeView将模型的数据项显示在 具有层次的列表中。
以上这些类都是基于QAbstractItemView抽象基类的。
3委托
默认的委托实现由QStyledItemDelegate类提供。
一个简单的例子:使用树形和列表两种视图来显示同一个模型的数据
#include <QApplication>
#include <QFileSystemModel>
#include <QTreeView>
#include <QListView>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建文件系统模型
QFileSystemModel model;
// 指定要监视的目录
model.setRootPath(QDir::currentPath());
// 创建树型视图
QTreeView tree;
// 为视图指定模型
tree.setModel(&model);
// 指定根索引
tree.setRootIndex(model.index(QDir::currentPath()));
// 创建列表视图
QListView list;
list.setModel(&model);
list.setRootIndex(model.index(QDir::currentPath()));
tree.show();
list.show();
return app.exec();
}
输出:
ps:
有关编程的学习,编程的理论框架必须要建立起来,同时需要一定量的实例,这样才能融会贯通。