Qt MVC结构之Model模型

文章介绍了Qt中的MVC模式,包括模型层Model、视图层View和控制层Controller。接着详细讲解了两种常见的Qt模型:QFileSystemModel用于展示文件系统内容,QStandardItemModel则是一个通用的二维数据管理模型,可用于构建自定义视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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进行渲染数据的角色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值