您的位置:首页 > 编程语言 > Qt开发

Qt 模型视图编程基础 model/view programming

2013-01-23 15:53 459 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: