码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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();
    }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    运行效果如下:

    分裂器中的左边是 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>
    
    • 1
    #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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

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

    三、QStandardItemModel/QListView

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

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

  • 相关阅读:
    11个精美网页——Web前端开发技术课程大作业,期末考试,Dreamweaver简单网页制作
    LeetCode:两数之和
    发布策略:蓝绿部署、金丝雀发布(灰度发布)、AB测试、滚动发布、红黑部署的概念与区别
    为什么要用PLL时钟芯片替换传统晶体和振荡器?
    一文了解人工智能AI、大模型、AI大模型、ChatGPT、GPT-4、OpenAI、Claude 3...
    Java中的锁
    金融工程学学习笔记第一章
    C# 如何使用windows服务做定时任务
    JavaSE进阶21天---第十八天---JavaSE(线程池、默认线程池、指定上限的线程池、自定义线程池、四种任务策略​)
    Elasticsearch:从零开始创建一个 ingest pipeline 处理器
  • 原文地址:https://blog.csdn.net/xuechanba/article/details/128149205
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号