QT - 模型与视图

经典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 <QSplitter>
#include <QTreeView>
#include <QListView>
#include <QFileSystemModel>
#include <QDir>

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 <QStandardItemModel>
#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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值