QT4介绍了一系列项视图(item view)类,它提供了一个模型视图(model/view)结构来管理数据和呈现用户的关系。
对于小部分情况,我们不需要动用模型,只通过项视图类就可以完成工作(QListWidget,QTableWidget,QTreeWidget)。例如使用QTableWidget,它其中包含QTableWidgetItem等,可以完成少量数据及操作。但是对于大数据就需要用到模型视图结构。
通常,model/view类分为三部分:models(模型), views(视图) 和 delegates(委托)。它们之间的关系正如图中所示。
所有的模型都是源自QAbstractItemModel类。它定义了被视图和委托使用的存取数据操作。数据可以通过文件,数据库或者应用组件提供。
QAbstractItemModel提供了足够被tables,lists和trees视图灵活使用的接口。当为list数据结构和类table数据结构重写一个新模型时,QAbstractListModel和QAbstractTableModel更适合作为起点。
QT提供了一些已经实现好了的models:
QStringListModel 是应用来存储简单QString列表项的。
QStandardItemModel是用来管理更复杂的树形结构项的,它的每一项都包含一个专门的数据。
QFileSystemModel提供一个关于文件和路径的本地归档系统(以前有QDirModel, 已被移除,可用QFileSystemodel代替)。
QSqlQueryModel, QSqlTableModel, QSqlRelationalTableModel是用模型视图存取数据库数据操作的。
如果这些标准的模型都不适合你,你可以根据需要来子类化QAbstractItemModel, QAbstractListModel, 或 QAbstractTableModel来完成自己的模型类。
通过为各种不同的视图完整的实现了:
QListView基于展示项的列表
QTableView为一个table模型展示数据
QTreeView展示一个分层列表数据模型的项
每一个类都基于QAbstractItemView的抽象类,尽管这些类都是实现好了的,但还是可以根据需要来子类化。
在模型视图框架中,委托都是来自共同的基类:QAbstractItemDelegate类。
从QT4.4起,默认委托被QStyleItemDelegate提供,并且也是Qt的标准视图的默认委托。在视图中QStyleItemDelegate和QItemDelegate是可供编辑器画出和提供项的可选择的独立类。用户亦可自定义委托。
QListView和QTreeView类是最适合的使用QFileSystemModel的视图类。
下面的例子运行后程序如下:
这个例子以最简单的方式使用model,并建立一个QFileSystemModel系统。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSplitter *splitter = new QSplitter;
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
setRootPath(const QString &)告诉模型将当前目录路径呈现给视图。
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index(QDir::currentPath()));
QListView *list = new QListView(splitter);
list->setModel(model);
list->setRootIndex(model->index(QDir::currentPath()));
setModel()为当前的视图设置模型
setRootIndex(const QModelIndex &)给view设置根项目索引
splitter->setWindowTitle("Two views onto the same file system model");
splitter->show();
Splitter组件添加了这两个视图,并由他来作为主窗口呈现这两个视图。
a.exec();
return 0;
}
Dir View Example
另一个简单的例子呈现文件系统。如图:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFileSystemModel model;
model.setRootPath("");
QTreeView tree;
tree.setModel(&model);
// Demonstrating look and feel features
tree.setAnimated(true); // 动态效果,在展开和收缩时会有动态的效果,默认false
tree.setIndentation(25); // 缩进,默认值为20
tree.setSortingEnabled(true); // 是否支持排序,当点击定层的header栏时会进行排序,默认是false
tree.setWindowTitle(QObject::tr("Dir View"));
#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5)
tree.showMaximized();
#else
tree.resize(640, 480);
tree.show();
#endif
a.exec();
return 0;
}