当前位置: 首页 > news >正文

【qt】初识模型和视图

模型和视图

  • 一.模型和视图的概念
    • 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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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后得到是kbif(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后得到是kbif(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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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,就大功告成了。文本清空按钮,那么简单,自己做。

四.总结

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

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

相关文章:

  • 全国数据库管理系统设计赛-人大金仓内核实训安排正式发布
  • 软件模块的耦合
  • qmt量化交易策略小白学习笔记第10期【qmt编程之获取股票订单流数据--内置Python】
  • 三、Gazebo中实现机器人仿真(小白上手)+ubuntu18.04
  • 路由聚合和VRRP技术
  • 【学习笔记】Windows GDI绘图(五)图形路径GraphicsPath详解(上)
  • grex 正则表达式生成工具
  • 电脑视频如何压缩变小 mp4视频太大怎么压缩不影响画质
  • QT--气泡框的实现
  • 搭建LNMP服务器
  • 如何利用curl命令访问Kubernetes API server
  • 2024电工杯A题详细思路代码分析数学建模:园区微电网风光储协调优化配置
  • SpringBoot多数据源启动出现循环依赖问题
  • AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情
  • uniapp 快手小程序隐藏scrollbar
  • CSS盒模型深入
  • echarts花样作死的坑
  • java中的hashCode
  • JSONP原理
  • LeetCode29.两数相除 JavaScript
  • leetcode388. Longest Absolute File Path
  • MySQL QA
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • passportjs 源码分析
  • SQL 难点解决:记录的引用
  • web标准化(下)
  • Web标准制定过程
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 聊聊hikari连接池的leakDetectionThreshold
  • 数据仓库的几种建模方法
  • 1.Ext JS 建立web开发工程
  • 阿里云服务器购买完整流程
  • ​iOS实时查看App运行日志
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​ssh免密码登录设置及问题总结
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #面试系列-腾讯后端一面
  • (k8s中)docker netty OOM问题记录
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (SpringBoot)第七章:SpringBoot日志文件
  • (八十八)VFL语言初步 - 实现布局
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (计算机网络)物理层
  • (转)3D模板阴影原理
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net 8.0 新的变化
  • .net core docker部署教程和细节问题
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...