【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_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,就大功告成了。文本清空按钮,那么简单,自己做。

四.总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码&#xff0c;但tabbar并没有显示。代码如下&#xff1a; "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

宠物空气净化器性价比大对决:小米、希喂、华为测评哪款最好用

在养宠的过程中中&#xff0c;我们经常会面对一些挑战&#xff0c;其中最为常见且令人困扰的就是宠物的掉毛问题。家中的猫猫们仿佛行走的大型蒲公英&#xff0c;不经意间就将毛发散落在各个角落&#xff0c;无论是家居摆设、舒适的沙发&#xff0c;还是我们心爱的衣物&#xf…

基于网络爬虫技术的网络新闻分析(四)

目录 4.2 系统异常处理 4.2.1 爬虫异常总体概况 4.2.2 爬虫访问网页被拒绝 5 软件测试 5.1 白盒测试 5.1.1 爬虫系统测试结果 5.1.2 中文分词系统测试结果 5.1.3 中文文章相似度匹配系统测试结果 5.1.4 相似新闻趋势展示系统测试结果 5.2 黑盒测试 5.2.1 爬虫系统测…

CTF实战分享 | RWZIP

前言 首先我们要了解&#xff0c;压缩包本身并不具备隐藏信息的功能&#xff0c;但由于在CTF竞赛中&#xff0c;经常出现压缩包与隐写术结合在一起的题目&#xff0c;所以我们需要掌握在CTF竞赛中有关 ZIP 压缩包题目的常见题型及分析手段。 读者福利 | CSDN大礼包&#xff1a…

Python面向对象数据库之ZODB使用详解

概要 ZODB(Zope Object Database)是一个纯Python的面向对象数据库。它允许程序员将Python对象以透明的方式存储在数据库中,无需将对象模型转换为关系模型,极大地简化了Python应用的数据持久化工作。 安装 安装ZODB非常简单,可以通过Python的包管理器pip进行安装: pip …

2024电工杯数学建模B题Python代码+结果表数据教学

2024电工杯B题保姆级分析完整思路代码数据教学 B题题目&#xff1a;大学生平衡膳食食谱的优化设计及评价 以下仅展示部分&#xff0c;完整版看文末的文章 import pandas as pd df1 pd.read_excel(附件1&#xff1a;1名男大学生的一日食谱.xlsx) df1# 获取所有工作表名称 e…

Android 屏保开关

设置-显示-屏保&#xff0c; 打开关闭 设置代码在 ./packages/apps/Settings/src/com/android/settings/dream/DreamMainSwitchPreferenceController.java &#xff0c; Overridepublic boolean isChecked() {return mBackend.isEnabled();}Overridepublic boolean setChecke…

K8S中Prometheus+Grafana监控

1.介绍 phometheus:当前一套非常流行的开源监控和报警系统。 运行原理&#xff1a;通过HTTP协议周期性抓取被监控组件的状态。输出被监控组件信息的HTTP接口称为exporter。 常用组件大部分都有exporter可以直接使用&#xff0c;比如haproxy,nginx&#xff0c;Mysql,Linux系统信…

实例展示vue单元测试及难题解惑

通过生动详实的例子带你排遍vue单元测试过程中的所有疑惑与难题。 技术栈&#xff1a;jest、vue-test-utils。 共四个部分&#xff1a;运行时、Mock、Stub、Configuring和CLI。 运行时 在跑测试用例时&#xff0c;大家的第一个绊脚石肯定是各种undifned报错。 解决这些报错…

网络协议测试仪设计方案:474-便携式手提万兆网络协议测试仪

便携式手提万兆网络协议测试仪 一、平台简介 便携式手提万兆网络协议测试仪&#xff0c;以FPGA万兆卡和X86主板为基础&#xff0c;构建便携式的手提设备。 FPGA万兆卡是以Kintex-7XC7K325T PCIeX4的双路万兆光纤网络卡&#xff0c;支持万兆网络数据的收发和网络协议…

同旺科技 FLUKE ADPT 隔离版发布 ---- 3

所需设备&#xff1a; 1、FLUKE ADPT 隔离版 内附链接&#xff1b; 应用于&#xff1a;福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于&#xff1a;福禄克Fluke 15B / 17B / 18B 总体连接&#xff1a; 连接线&#xff0c;根据自己实际需求而定&#xff1b; …

java操作Redis缓存设置过期时间

如何用java操作Redis缓存设置过期时间&#xff1f;很多新手对此不是很清楚&#xff0c;为了帮助大家解决这个难题&#xff0c;下面小编将为大家详细讲解&#xff0c;有这方面需求的人可以来学习下&#xff0c;希望你能有所收获。 在应用中我们会需要使用redis设置过期时间&…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则&#xff1a;密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近&#xff0c;成为一个视觉单位&#xff0c;减少混乱&#xff0c;形成清晰的结构。 两端对齐&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左边&#x…

融资融券利率4.0%!融资融券保证金比例和余额

融资融券利率最低是4.0%~5.0%&#xff0c;这是目前市场最低的利率水平&#xff0c;股票佣金万一。 各家券商的利率差异是较大的&#xff0c;现在无门槛利率是5%&#xff0c;根据投资者的资金量大小在4.0%~5%之间浮动&#xff0c;具体需要通过对应证券经理协商办理&#xff01;…

C++_vector操作使用

文章目录 &#x1f680;1.1 vector介绍&#x1f680;1.2 vector的初始化&#x1f680;1.3 vector的常用内置函数&#x1f680;1.4 vector的遍历 &#x1f680;1.1 vector介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元…

什么是线程安全?如何保证线程安全?

目录 一、引入线程安全 &#x1f447; 二、 线程安全&#x1f447; 1、线程安全概念 &#x1f50d; 2、线程不安全的原因 &#x1f50d; 抢占式执行&#xff08;罪魁祸首&#xff0c;万恶之源&#xff09;导致了线程之间的调度是“随机的” 多个线程修改同一个变量 修改…

Java代码审计-XSS审计

一、漏洞简介 XSS是Cross Site Scripting的缩写&#xff0c;意为"跨站脚本攻击"&#xff0c;为了避免与层叠样式表(Cascading Style Sheet&#xff0c;CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS。XSS是一种针对网站应用程序的安全漏洞攻击技术&#xff…

线上申请流量卡一些必知的小知识,愿每个人都能刷到!

很多朋友都想办理一张大流量卡&#xff0c;但是又怕被套路&#xff0c;一时不知道该怎么选择&#xff0c;那个纠结啊。 今天&#xff0c;小编用自己多年的行业经验给大家整理了一些办卡攻略&#xff0c;希望能帮助大家选到适合自己的流量卡。 ​1、有的流量卡都是免费申请&…

使用JavaScript日历小部件和DHTMLX Gantt的应用场景(三)

DHTMLX Suite UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件&#xff0c;这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足项目管理应用…

了解 Linux 网络卡绑定:提高网络性能与冗余性

在现代 IT 基础设施中&#xff0c;网络性能和可靠性至关重要。对于许多企业和个人用户来说&#xff0c;确保网络的高可用性和冗余性是首要任务之一。Linux 提供了一个强大的解决方案——网络卡绑定&#xff08;Network Interface Card Bonding&#xff0c;简称 NIC Bonding&…