13.2.5 便利模型类
对于一些特殊的数据集,Qt的Model/View框架提供了专门的模型类来处理它们。这些模型类虽然也是QAbstractItemModel的派生类,但是它们的使用方式非常简单,根本不需要程序员派生任何新的模型类,因此,我们将它们称为便利模型类(convenience model class)。
Qt提供了以下便利模型类:QStringListModel,处理数据项为字符串的列表;QFileSystemModel,处理具有树状层次结构的本地文件系统;QSQLQueryModel及其子类QSqlTableModel、QSqlRelationalTableModel,负责使用SQL语句访问数据库。由于最后这几个类涉及数据库操作,比较复杂,本节不讨论它们。下面我们仅阐述QStringListModel以及QFileSystemModel的用法。
类QStringListModel处理数据项为字符串的列表,其使用方式如代码段13 13所示。程序员不需要派生任何新模型类,只需要像行①那样,将一个QStringList对象作为参数,构造一个QStringListModel对象。由于新对象已经重载了必要的虚函数,实现了QAbstractItem Model定义的接口,因而立即可以和QListView对象协同工作。
代码段13 13,类QStringListModel的使用,取自z:\examples\mvc\QStringListModel_demo\main.cpp
- QStringList list;
- list << "One" << "Two" << "Three" << "Four" << "Five";
- QStringListModel listModel(list); ①
- QListView listView;
- listView.setModel( &listModel );
- listView.show();
类QFileSystemModel负责处理具有树状层次结构的本地文件系统,其使用方式如代码段13 14所示。运行该例子,本地文件系统的信息会被显示在一个窗口中,所显示的信息包括文件的大小、类型、日期信息。每个目录可以被展开/折叠。
当该类的对象刚刚被创建时(行①),新对象并不会立即开始扫描本地文件系统。只有当该类的setRooPath()函数被调用时(行②),新对象才会启动一个独立的线程扫描整个文件系统,视图类才能够获得并显示文件系统的信息。setRootPath()函数的另外一个功能是创建一个监视器(是类QFileSystemWatcher的对象),对该函数参数所指定的路径进行监视。一旦该路经下的文件或者目录被删除、更改或者该路经下出现了新的文件、子目录,该监视器会通知模型类,模型类会通知视图类以更新显示。
代码段13 14,便利模型类QFileSystemModel的用法,取自z:\examples\mvc\file_system\main.cpp
- QFileSystemModel model; ①
- model.setRootPath("C:/Documents and Settings"); ②
- QTreeView treeView;
- treeView.setModel(&model);
- treeView.show();