【qt】初识模型和视图

news2024/11/19 7:40:26

模型和视图

  • 一.模型和视图的概念
    • 1.关系
    • 2.模型
    • 3.数据
    • 4.视图
    • 5.特点
  • 二.文件系统模型
    • 1.那种数据?
    • 2.界面拖放
    • 3.创建模型
    • 4.模型设置数据
    • 5.视图设置模型
    • 6.模型索引
    • 7.模型操作数据
      • ①文件名
      • ②文件大小
      • ③文件类型
      • ④是否是目录
      • ⑤文件路径
  • 三.字符串链表模型
    • 1.那种数据?
    • 2.界面拖放
    • 3.创建模型
    • 4.模型设置数据
    • 5.视图设置模型
    • 6.模型插入数据
      • ①尾部添加数据
      • ③选中位置插入
    • 7.模型删除数据
      • ①选中位置删除
      • ②清空
      • ③初始化模式数据
    • 8.模型拿到数据
  • 四.总结

一.模型和视图的概念

1.关系

模型管理着数据,数据支撑着模型,视图展示着模型。

在这里插入图片描述

2.模型

模型是一个类,已经为对应数据写好操作的类,不同的数据对应着不同的模型,模型以行来管理着数据。

在这里插入图片描述

3.数据

数据可以分为:数据库数据,内存数据,磁盘数据。

4.视图

View相当于模型的界面,用来展示模型。
Widget相当于模型与视图结合在一起了。

5.特点

通过模型与视图的框架,使数据分类,大大的提高了灵活性,响应性,可以更好的处理复杂的数据。

二.文件系统模型

目标效果:
在这里插入图片描述

1.那种数据?

文件系统模型管理着磁盘数据

2.界面拖放

在这里插入图片描述
界面的拖放,我就不讲了,不会的可以问我。

3.创建模型

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QFileSystemModel>//文件系统模型头文件

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QFileSystemModel*model;//定义文件系统模型数据成员
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    model=new QFileSystemModel;//创建模型
}

MainWindow::~MainWindow()
{
    delete ui;
}

4.模型设置数据

model->setRootPath(QDir::currentPath());

在这里插入图片描述
通过F1在线文档查看,就是相当于是文件目录中设置一个监视器,目录文件数据的一举一动都能被检测到。

5.视图设置模型

一个模型可以对应多个视图

    ui->treeView->setModel(model);
    ui->listView->setModel(model);
    ui->tableView->setModel(model);

设置好视图,我们就可以看到界面了
在这里插入图片描述

6.模型索引

在这里插入图片描述
这个信号的参数就是一个模型索引,在视图中,我们可以通过模型索引来对模型进行操作。
比如说我们希望ListViewTableView跟随TreeView的变化而变化。

void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    ui->listView->setRootIndex(index);
    ui->tableView->setRootIndex(index);
}

运行结果:
在这里插入图片描述

7.模型操作数据

①文件名

ui->labelFileName->setText(model->fileName(index));

②文件大小

内存单位换算:
1 byte(字节)= 8 bits(位)
1 kilobyte(KB)= 1024 bytes(字节)
1 megabyte(MB)= 1024 kilobytes(KB)
1 gigabyte(GB)= 1024 megabytes(MB)
1 terabyte(TB)= 1024 gigabytes(GB)

int size=model->size(index)/1024;//原本得到是字节,除以1024后得到是kb
    if(size>1024)//如果kb还大于1024,那就再除1024转换成mb
    {
        ui->labelFileSize->setText(QString::asprintf("%.1f MB",size/1024.0));
    }
    else
    {
        ui->labelFileSize->setText(QString::asprintf("%d MB",size));
    }

③文件类型

ui->labelType->setText(model->type(index));

④是否是目录

ui->checkBox->setChecked(model->isDir(index));

⑤文件路径

ui->labelPath->setText(model->filePath(index));

完整代码:

void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
    ui->listView->setRootIndex(index);
    ui->tableView->setRootIndex(index);
    
    ui->labelFileName->setText(model->fileName(index));
    int size=model->size(index)/1024;//原本得到是字节,除以1024后得到是kb
    if(size>1024)//如果kb还大于1024,那就再除1024转换成mb
    {
        ui->labelFileSize->setText(QString::asprintf("%.1f MB",size/1024.0));
    }
    else
    {
        ui->labelFileSize->setText(QString::asprintf("%d MB",size));
    }
    ui->labelType->setText(model->type(index));
    
    ui->checkBox->setChecked(model->isDir(index));
    
    ui->labelPath->setText(model->filePath(index));
}

运行结果:
在这里插入图片描述
perfect,哈哈,你们找不到我的小电影吧,你们玩的时候,可别把你的小电影展示出来了。

三.字符串链表模型

目标效果:
在这里插入图片描述

1.那种数据?

字符串链表模型管理着内存数据QStringList

2.界面拖放

在这里插入图片描述

3.创建模型

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStringListModel>//字符串链表模型

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QStringListModel*model;
};
#endif // MAINWINDOW_H

mainwindow.cpp

model=new QStringListModel;//创建模型

4.模型设置数据

QStringList list={"上海","北京","南京","成都","达州","江苏","广东"}; 
model->setStringList(list);

5.视图设置模型

 ui->listView->setModel(model);
 ui->tableView->setModel(model);

运行结果:
在这里插入图片描述

6.模型插入数据

①尾部添加数据

模型是以来管理数据,所以不管我们要实现什么功能,我们都要找到行,通过视图我们可以拿到模型索引。
模型索引其实就是类似于二维数值,我们通过其拿到行和列。

void MainWindow::on_pushButtonAdd_clicked()
{
    model->insertRow(model->rowCount());//尾插法
    //但是现在添加的是一个空行
    QModelIndex index=model->index(model->rowCount()-1,0);//通过行列拿到模型索引
    model->setData(index,"新的城市");//设置模型数据
    ui->ListView->setCurrentIndex(index);//选择当前索引
}

运行结果:
在这里插入图片描述

③选中位置插入

void MainWindow::on_pushButtonInsert_clicked()
{
    QModelIndex index=ui->listView->currentIndex();//通过视图获取当前索引位置
    //模型以行管理数据,所以插入的是行,所以通过模型索引拿到行
    model->insertRow(index.row());//通过模型索引拿到行
    model->setData(index,"新的城市");//设置数据
    ui->listView->setCurrentIndex(index);//选中当前行

}

运行结果:
在这里插入图片描述

7.模型删除数据

①选中位置删除

void MainWindow::on_pushButtonDel_clicked()
{
    QModelIndex index=ui->listView->currentIndex();//获取当前索引
    model->removeRow(index.row());//通过模型索引获取行,然后移除模型数据
}

运行结果:
在这里插入图片描述

②清空

void MainWindow::on_pushButtonClearList_clicked()
{
    model->removeRows(0,model->rowCount());//通过移除多行来清空列表
}

运行结果:
在这里插入图片描述

③初始化模式数据

清空后可以初始化

void MainWindow::on_pushButtonInit_clicked()
{
    QStringList list={"上海","北京","南京","成都","达州","江苏","广东"};
    model->setStringList(list);    
}

8.模型拿到数据

void MainWindow::on_pushButtonDisplay_clicked()
{
    ui->plainTextEdit->clear();//每次获取前,先把上次的清空。
    QStringList list=model->stringList();//拿到字符串链表数据
    for(int i=0;i<list.count();i++)
    {
        ui->plainTextEdit->appendPlainText(list[i]);
    }
}

运行结果:
在这里插入图片描述
OK,就大功告成了。文本清空按钮,那么简单,自己做。

四.总结

模型有很多种,我这里只先简单了讲了文件系统模型字符串链表模型.通过学习,我们要重点的掌握数据,模型,视图之间的关系。

慌了,你就慢下来,还慌,你就停下来!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1687316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化您的任务——crewAI 初学者教程

今天&#xff0c;我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息&#xff1a;crewAI。 我将在这里或那里跳过一些内容&#xff0c;使本教程成为一个精炼的教程&#xff0c;概述帮助您入门的关键概念和要点 今天&#xff0c;我写这篇文章是为了…

云计算期末复习(1)

云计算基础 作业&#xff08;问答题&#xff09; &#xff08;1&#xff09;总结云计算的特点。 透明的云端计算服务 “无限”多的计算资源&#xff0c;提供强大的计算能力 按需分配&#xff0c;弹性伸缩&#xff0c;取用方便&#xff0c;成本低廉资源共享&#xff0c;降低企…

一位老网工19年前写下的话,激励无数网工人

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我是老杨。 2005年的互联网没有如今这么发达&#xff0c;但2005年&#xff0c;有一个技术人写了一段话&#xff0c;感动了无数…

LoadBalancer

一、手写随机负载均衡 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><!--引入nacos discovery--> <dependency><groupId>com…

vue列表数据添加和删除实例

运行效果如下&#xff1a; 详细代码&#xff1a; 自行添加vue.min.js文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&…

光耦合器的特性和应用概述

光耦合器又称光电耦合器&#xff0c;是现代电子学中必不可少的元件&#xff0c;确保隔离电路之间安全有效的信号传输。本文探讨了光耦合器的特性及其多样化应用&#xff0c;强调了它们在各种电子系统中的关键作用。 什么是光耦合器&#xff1f; 光耦合器是一种设计用于利用光传…

SpringCloud Alibaba详解:打造高可用的分布式系统

SpringCloud Alibaba是一个基于Spring Cloud的微服务开发框架&#xff0c;它集成了阿里巴巴的一系列中间件和工具&#xff0c;能够快速构建高可用的分布式系统。在本文中&#xff0c;将详细介绍如何使用SpringCloud Alibaba来打造高可用的分布式系统&#xff0c;并通过代码案例…

SAP-FICO-凭证编号控制

成本凭证编号KANK 如果自己的公司下没有&#xff0c;直接复制系统原有的就可以。使用系统默认即可。 如果不维护 会报错“CO-凭证编号分配对于成本控制范围****中的商业事务COIN无效” 财务凭证编号FBN1 可以用OBH2批量复制编号范围。 物料账期MMPV 财务账期OB52

TCP—三次握手和四次挥手

目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…

国产AI服务器Tr i - M o d e R A I D 卡,Tri-Mode HBA卡,SAS RAID卡

技术规格 • 主机接口&#xff1a;PCIe 4.0 x8 • 数据接口&#xff1a;SATA/SAS/PCIe三模 • 连接器&#xff1a;2x8 SFF-8654&#xff0c;2x M-Key M.2(2280) • 控制器&#xff1a;IOC 2250 • 硬盘数量&#xff1a;16 2 块SATA/SAS/PCIe • RAID模式&#xff1a;RAID…

蓝牙模块在无人机 ID识别、标准制定发挥的作用及其应用优势和面临的挑战

随着科技的飞速发展&#xff0c;无人机已经广泛应用于航拍、农业、救援、物流等多个领域。而在无人机的通信与控制系统中&#xff0c;蓝牙模块扮演着重要的角色。本文将探讨蓝牙模块在无人机Remote ID识别和标准制定执行中发挥的作用&#xff0c;并分析其应用优势和面临的挑战。…

mysql-索引、存储引擎、事务、锁机制和优化

1. MySQL的索引 1.1 概述 索引是通过某种算法&#xff0c;构建出一个数据模型&#xff0c;用于快速找出在某个列中有以特定值的行&#xff0c;不使用索引&#xff0c;MySQL必须从一条记录开始读完整个表&#xff0c;直到找出相关的行&#xff0c;表越大查询数据所花的时间越多…

【全部更新完毕】2024长三角数学建模A题思路代码文章教学-“抢救”落水手机

文章摘要部分&#xff1a; “抢救”落水手机 摘要 文章主要探讨了如何科学地处理和搜索在水体中意外掉落的物品&#xff1a;华为 Mate 60 Pro手机和居民身份证。本文基于物理模型和动力学分析&#xff0c;为不同水体环境中的掉落物品提供了详尽的搜索策略和打捞建议。 本文…

C++ | Leetcode C++题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; class Solution { public:bool check(TreeNode *u, TreeNode *v) {queue <TreeNode*> q;q.push(u); q.push(v);while (!q.empty()) {u q.front(); q.pop();v q.front(); q.pop();if (!u && !v) continue;if ((!u || !v) ||…

碳课堂|ISO 14067 产品碳足迹国际标准

为规范评估产品碳排放&#xff0c;国际标准化组织发布了《ISO14067&#xff1a;2018温室气体-产品碳足迹-量化要求及指南》&#xff0c;标准量化产品生命周期阶段&#xff08;包括从资源开采、原材料采购到产品的生产、使用和报废阶段&#xff09;的温室气体排放的通用标准。该…

java项目之桂林旅游景点导游平台源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的桂林旅游景点导游平台。 项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 桂林旅游景点导游…

腾讯TDSQL-C灰度发布列存索引; Azure Copilot集成支持Azure上各种托管数据库;

重要更新 1. Copilot for Azure新增了对Azure SQL、 Azure Database for MySQL的支持([8] [14])。Copilot for Azure是微软云提供的基于大模型技术的助手工具&#xff0c;主要能力包括了&#xff1a;该大模型可以获得最新的文档&#xff0c;以及客户的Azure资源情况&#xff0c…

如何排查hpet导致的CPU高负载——《OceanBase诊断系列》之十

1. 前言 我在OceanBase问答社区协助用户排查了一个CPU占用率过高的问题&#xff0c;帖子原文是&#xff1a; 《刚刚新安装的OceanBase集群&#xff0c;没有任何数据&#xff0c;CPU占用非常高&#xff0c;这正常吗&#xff1f;》。从这个场景出发&#xff0c;来分享相关的诊断…

毫米波雷达的自我学习——TI毫米波雷达数据的BIN存储

这里写目录标题 TI毫米波数据以16位二进制补码的形式存储数据存储具有DCA1000数据格式的xWR12xx和xWR14xx&#xff08;交错模式&#xff09;具有DCA1000数据格式的xWR16xx和**IWR6843**&#xff08;只能非交错模式&#xff09;其他 TI毫米波数据以16位二进制补码的形式存储 按…