QT - 模型与视图
创始人
2024-03-15 11:28:04

经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面。

MVC 不是一种设计模式,而是一种框架模式。

在 QT 中,换个说法,叫MVD(D - 代理)
在这里插入图片描述
链接: https://www.bilibili.com/video/BV18x411S7gT/?spm_id_from=333.337.search-card.all.click&vd_source=b91967c499b23106586d7aa35af46413
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

一、QListView 和 QTreeView 与文件系统模型结合的例子

使用模型和视图,需要添加对应的头文件。

一个小例子:

#include "widget.h"
#include "ui_widget.h"
#include 
#include 
#include 
#include 
#include Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QSplitter *spliter = new QSplitter;QFileSystemModel *model = new QFileSystemModel; //文件系统模型model->setRootPath(QDir::currentPath());//设置当前路径为根目录QTreeView *treeView = new QTreeView(spliter);treeView->setModel(model);//将视图treeView与模型model进行绑定QListView *listView = new QListView(spliter);listView->setModel(model);//将视图listView与模型model进行绑定spliter->show();
}    

运行效果如下:

分裂器中的左边是 treeView 视图,右边是 listView 视图。
在这里插入图片描述
遇到下面的问题:QFileSystemModel类显示根目录不起作用及setRootPath、setRootIndex函数的区别。https://blog.csdn.net/danshiming/article/details/127035073

修改后,
在这里插入图片描述
运行效果如下,
在这里插入图片描述
这个是放在widget中的,所以会显示两个窗体,一个是分裂器窗体,一个是widget窗体。分裂器将两个视图给分开了。

将这部分代码放入main中并不让widget显示,就只会显示一个窗体了。

在这里插入图片描述

二、QStandardItemModel 和 QTableView 结合的例子

链接: https://www.bilibili.com/video/BV1yx411r7qp/?spm_id_from=333.788.recommend_more_video.-1&vd_source=b91967c499b23106586d7aa35af46413

运行效果如下:
在这里插入图片描述
使用模型和视图,需要添加相应的头文件,这里使用到了QStandardItemModel,所以要加

#include 
#include "widget.h"
#include "ui_widget.h"
#include "qcustomplot.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);/* 使用构造函数来指定行和列 */m_pModel = new QStandardItemModel(20, 5); // 20行5列 m_pModel->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"班级"<<"年龄"<<"性别"<<"成绩");ui->tableView->setAlternatingRowColors(true);//允许隔行变色/**QHeaderView::Stretch:QHeaderView将自动调整section的大小以填充可用空间。大小不能由用户或以编程方式更改。*/ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//设置伸缩模式ui->tableView->horizontalHeader()->setStretchLastSection(true);// 表示将最后一列填充为满表格ui->tableView->setModel(m_pModel);ui->tableView_2->setModel(m_pModel);
}Widget::~Widget()
{delete ui;
}void Widget::on_btnClear_clicked()
{/* 对视图进行操作 */int rowCount = m_pModel->rowCount();/* 注意:只能从后往前删 */for(int r = rowCount; r>=0; --r){m_pModel->removeRow(r);}/* 重新插入空行 */for(int r=0; r < rowCount; ++r){m_pModel->insertRow(r);}
}

说一下什么叫做 将最后一列填充为满。
此外,还需要注意下是怎样达到逐行变色的。
在这里插入图片描述

三、QStandardItemModel/QListView

在这里插入图片描述
widget.cpp

在这里插入图片描述
运行代码,显示如下。
在这里插入图片描述
在这个视频的最后还介绍了样式表的简单使用,因不是本节重点,没有记录。

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...