模型/视图编程
Qt中的模型/视图架构用来实现大量的数据存储、处理及显示。MVC(Model-View-Controller)包括了3个组件:模型(Model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式。委托(Delegate)用于定制数据的渲染和编辑方式。
1.模型
所有的模型都基于QAbstractItemModel类,该类提供了十分灵活的接口来处理各种视图,这些视图可以将数据的表现形式为表格
(table)、列表
(list)、树
(tree)。
Qt提供了一些现成的模型来处理数据项:
QStringListModel
存储简单的QString项目列表;
QStandardItemModel
管理复杂的属性结构数据项,每一个数据项可以包含任意的数据;
QFileSystemModel
提供了本地文件系统中文件和目录信息;
QSqlQueryModel
、QSqlTableModel
和QSqlRelationTableModel
用来访问数据库。
标准模型还无法满足需要时,可子类化QAbstractItemModel
、QAbstractListModel
或QAbstractTableModel
来创建自定义的模型。
常见的3种模型为列表模型
、表格模型
、树模型
,如下图所示:
为确保数据的表示与数据的获取相分离,Qt引入了模型索引的概念,输入和委托均可通过模型索引来请求数据并显示。只有模型需要知道怎样获取数据,被模型管理的数据类型可以被广泛的定义。模型索引包含一个指针,指向创建他们的模型,使用多个模型时可避免混淆。模型索引QModelIndex类提供对一块数据的临时引用,用来修改或检索模型中的数据,获取一个数据项的模型索引必须指定模型的3个属性:行号、列号和父项的模型索引。如:
QModelIndex index = model->index(row,column,parent);
也可通过模型指定的相关数据项对应的模型索引以及特定的角色来获取需要的类型数据,如:
QVariant value = model->data(index,role);
常用的角色类型:
具体操作
具体代码
main.cpp
#include <QApplication>
#include <QAbstractItemModel>
#include <QAbstractItemView>
#include <QItemSelectionModel>
#include <QDirModel>
#include <QTreeView>
#include <QListView>
#include <QTableView>
#include <QSplitter>
#include <QAbstractItemView>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
//创建模型
QDirModel model;
//创建树视图、列表视图、表格视图
QTreeView tree;
QListView list;
QTableView table;
//视图设置模型
tree.setModel(&model);
list.setModel(&model);
table.setModel(&model);
//设置视图对象的选择方式为多选, list/table选择方式同tree
tree.setSelectionMode(QAbstractItemView::MultiSelection);
list.setSelectionMode(tree.selectionMode());
table.setSelectionMode(tree.selectionMode());
//树视图双击信号发送后, 列表及表格视图刷新内容
QObject::connect(&tree, SIGNAL(doubleClicked(QModelIndex)), &list, SLOT(setRootIndex(QModelIndex)));
QObject::connect(&tree, SIGNAL(doubleClicked(QModelIndex)), &table, SLOT(setRootIndex(QModelIndex)));
QSplitter *splitter = new QSplitter;
splitter->addWidget(&tree);
splitter->addWidget(&list);
splitter->addWidget(&table);
splitter->setWindowTitle(QString("模型/视图"));
splitter->show();
return app.exec();
}
textModelView.pro
结语:
时间: 2020-08-12