1、MVC介绍
MVC 就是Model-View-Control模式的简称,包括模型层(Model), 视图层(View), 控制层(Controller)。Model主要负责管理数据,View主要用来显示数据,Controller主要用来操作数据,控制View联动。Qt也采用了这个模式,模型层用Model,视图层用View,控制层改名叫了代理Delegate。
2、几种常见模型的介绍
模型分为几种,有列表模型,表格模型,以及树模型。详细可以参考Qt的帮主文档,搜索Model/View Programming。
2.1、QFileSystemModel
我们可以举个简单的例子,用QFileSystemModel来实现文件夹内容的展示,QFileSystemModel是Qt给我们提供的处理本地文件系统的文件和目录。
#include "mainwindow.h"
#include <QApplication>
#include<QFileSystemModel>
#include<QTreeView>
#include<QSplitter>
#include<QListView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSplitter *spliter=new QSplitter();
QFileSystemModel *fileModel=new QFileSystemModel();
fileModel->setRootPath(QDir::currentPath());
QTreeView *tree=new QTreeView(spliter);
tree->setModel(fileModel);
tree->setRootIndex(fileModel->index(QDir::currentPath()));
QListView *list=new QListView(spliter);
list->setModel(fileModel);
list->setRootIndex(fileModel->index(QDir::currentPath()));
spliter->setWindowTitle("FileSystem");
spliter->resize(1080,720);
spliter->show();
MainWindow w;
w.show();
return a.exec();
}
如下是测试代码的结果:
左边是TreeView视图,右边是ListView视图,通过model设置根目录位置,然后在创建视图,视图加载模型中的数据,并且设置视图的根索引为model的当前目录的索引。
2.2、QStandardItemModel
QStandardItemModel 是标准的以项数据(item data)为基础的标准数据模型类,通常与 QTableView 组合成 Model/View 结构,实现通用的二维数据的管理功能,如下将通过QStandardItemModel 实现一个树形模型。
#include "mainwindow.h"
#include <QApplication>
#include<QFileSystemModel>
#include<QTreeView>
#include<QSplitter>
#include<QListView>
#include<QStandardItemModel>
#include<QStandardItem>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建模型
QStandardItemModel model;
//获取模型的根的值
QStandardItem *parentItem=model.invisibleRootItem();
//子节点
QStandardItem *item0=new QStandardItem();
item0->setData("item0",Qt::EditRole);
QPixmap pix0(50,50);
pix0.fill(Qt::red);
item0->setData(QIcon(pix0),Qt::DecorationRole);
parentItem->appendRow(item0);
//更换父节点
parentItem=item0;
QStandardItem *item1=new QStandardItem();
item1->setData("item1",Qt::EditRole);
QPixmap pix1(50,50);
pix1.fill(Qt::green);
item1->setData(QIcon(pix1),Qt::DecorationRole);
parentItem->appendRow(item1);
QStandardItem *item2=new QStandardItem();
item2->setData("item2",Qt::EditRole);
QPixmap pix2(50,50);
pix2.fill(Qt::blue);
item2->setData(QIcon(pix2),Qt::DecorationRole);
parentItem->appendRow(item2);
QTreeView tree;
tree.setModel(&model);
tree.show();
MainWindow w;
w.show();
return a.exec();
}
测试代码的结果:
上面的item项是通过setData()来赋值的,它的第一个参数是QVariant,它可以转化为任意类型,而第二个参数是role,可以在Qt帮助手册中看到,所有的角色枚举值的意思,比如在上述案例中的EditRole指可编辑的文本渲染角色,而DecorationRole指通过QColor,QIcon或者QPixmap进行渲染数据的角色。