Qt 模型视图编程基础 model/view programming
2013-01-23 15:53
459 查看
QT4介绍了一系列项视图(item view)类,它提供了一个模型视图(model/view)结构来管理数据和呈现用户的关系。
![](http://img.my.csdn.net/uploads/201301/23/1358927703_6483.PNG)
对于小部分情况,我们不需要动用模型,只通过项视图类就可以完成工作(QListWidget,QTableWidget,QTreeWidget)。例如使用QTableWidget,它其中包含QTableWidgetItem等,可以完成少量数据及操作。但是对于大数据就需要用到模型视图结构。
通常,model/view类分为三部分:models(模型), views(视图) 和 delegates(委托)。它们之间的关系正如图中所示。
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的抽象类,尽管这些类都是实现好了的,但还是可以根据需要来子类化。
从QT4.4起,默认委托被QStyleItemDelegate提供,并且也是Qt的标准视图的默认委托。在视图中QStyleItemDelegate和QItemDelegate是可供编辑器画出和提供项的可选择的独立类。用户亦可自定义委托。
下面的例子运行后程序如下:
![](http://img.my.csdn.net/uploads/201301/23/1358927744_1111.PNG)
这个例子以最简单的方式使用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;
}
另一个简单的例子呈现文件系统。如图:
![](http://img.my.csdn.net/uploads/201301/23/1358931428_9638.PNG)
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;
}
对于小部分情况,我们不需要动用模型,只通过项视图类就可以完成工作(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;
}
相关文章推荐
- Qt的模型/视图编程方法(model/view programming)
- Qt的模型/视图编程方法(model/view programming)
- 模型/视图编程(Model/View Programming)
- QT Basic 014 Model/View programming (模型、视图编程)
- C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)
- Qt 之 使用 Model-View(模型视图框架)动态的加载显示数据
- QT——模型/视图(model/view)
- qt4 Model/View编程:2 使用模式和视图
- Silverlight之MVVM:模型-视图-视图模型(Model-View-ViewModel)(16)
- 翻译_iOS视图编程指南(View Programming Guide for iOS)之介绍
- .NET编程模型体会(Programming Model/Paradigm)
- View Programming Guide for iOS ---- iOS 视图编程指南(一)
- ASP.NET MVC(模型(Model),视图(View)和控制Controller)实践:实现身份验证权限管理
- View Programming Guide for iOS ---- iOS 视图编程指南(四)---Views
- qt model view 编程总结
- Model、View、ViewModel结构以及全局视图模型注入器的说明
- MVC(Model View Controller)模型-视图-控制器
- OpenGL中查询模型视图(Model View)矩阵中的数据
- 简单了解Backbone.js的Model模型以及View视图的源码
- MVVM:模型-视图-视图模型(Model-View-ViewModel)