【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,就大功告成了。文本清空按鈕,那么簡單,自己做。

四.總結

模型有很多種,我這里只先簡單了講了文件系統模型字符串鏈表模型.通過學習,我們要重點的掌握數據,模型,視圖之間的關系。

慌了,你就慢下來,還慌,你就停下來!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13942.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

論Promise在前端江湖的地位及作用

系列文章&#xff1a; 先擼清楚&#xff1a;并發/并行、單線程/多線程、同步/異步 論Promise在前端江湖的地位及作用 前言 上篇文章闡述了并發/并行、單線程/多線程、同步/異步等概念&#xff0c;這篇將會分析Promise的江湖地位。 通過本篇文章&#xff0c;你將了解到&#x…

100base-tx、100base-fx的區別

100表示網線設計的頻率&#xff0c;單位MHz。值越大&#xff0c;網線的速度越快。baseBASEband的縮寫&#xff0c;基帶t物理介質是雙絞線纜f物理介質是光纖x同一個傳輸效率下的多種不同的標準 T表示雙絞線&#xff0c;base-tx是運行超五類雙絞線的快速以太網端口&#xff0c;全…

AI崛起,掌握它,開啟智能新生活!

AI崛起&#xff0c;掌握它&#xff0c;開啟智能新生活&#xff01; &#x1f604;生命不息&#xff0c;寫作不止 &#x1f525; 繼續踏上學習之路&#xff0c;學之分享筆記 &#x1f44a; 總有一天我也能像各位大佬一樣 &#x1f3c6; 博客首頁 怒放吧德德 To記錄領地 &…

Linux中vim的基本使用

目錄 vim中的三種模式以及基本操作命令模式(默認模式)插入模式底行模式 命令模式下的命令底行模式下的命令 vim是Linux和Unix環境下最基本的文本編輯器&#xff0c;類似于windows上的記事本 vim和Visual studio相比&#xff0c;vim并不集成&#xff0c;vim只能用來寫代碼 VS把寫…

Nginx限制IP訪問詳解

在Web服務器管理中&#xff0c;限制某些IP地址訪問網站是一個常見的需求。Nginx作為一款高性能的HTTP服務器和反向代理服務器&#xff0c;提供了靈活強大的配置選項來實現這一功能。本文將詳細講解如何在Nginx中限制IP訪問&#xff0c;并通過示例代碼展示具體操作。 一、Nginx…

使用 Python 簡單幾步去除 PDF 水印

推薦一個AI網站&#xff0c;免費使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鯨AI 在處理 PDF 文件時&#xff0c;水印有時會影響文件的可讀性或美觀性。幸運的是&#xff0c;Python 提供了多種庫來操作 PDF 文件&#xff0c;其中 PyMuPDF&#xff08;又名 fitz&#xf…

2024年5月24日 十二生肖 今日運勢

小運播報&#xff1a;2024年5月24日&#xff0c;星期五&#xff0c;農歷四月十七 &#xff08;甲辰年己巳月戊子日&#xff09;&#xff0c;法定工作日。 紅榜生肖&#xff1a;龍、牛、猴 需要注意&#xff1a;兔、羊、馬 喜神方位&#xff1a;東南方 財神方位&#xff1a;…

深度學習之基于Matlab的BP神經網絡交通標志識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 隨著智能交通系統&#xff08;ITS&#xff09;的快速發展&#xff0c;交通標志識別&#xff0…

BUUCTF---misc---[MRCTF2020]ezmisc

1、附件下載后是一張圖片 2、查看屬性&#xff0c;winhex分析&#xff0c;沒發現什么 3、在kali中binwalk和foremost也沒找到什么信息 4、用stegsolve分析也沒發現什么 5、這里幾乎常見的misc方法都試過了&#xff0c;還是沒有發現什么 6、回歸到圖片本身&#xff0c;想到的…

Nginx性能調優:深入剖析配置與調優技巧

一、引言 Nginx作為一款高性能的HTTP和反向代理服務器&#xff0c;已經被廣泛應用于各種Web服務中。然而&#xff0c;要想充分發揮Nginx的性能優勢&#xff0c;僅僅安裝和配置默認設置是遠遠不夠的。本文將深入剖析Nginx的配置與調優技巧&#xff0c;幫助讀者打造更加高效、穩…

基于51單片機智能大棚澆花花盆澆水灌溉補光散熱設計

一.硬件方案 本設計通過光敏電阻檢測光照強度&#xff0c;然后A/D模塊PCF8591處理后&#xff0c;將光照強度值實時顯示在液晶上&#xff0c;并且可以按鍵控制光照的強度值&#xff0c;當光照低于設定的閾值&#xff0c;1顆白色高亮LED燈亮進行補光&#xff0c;光照高于設定的閾…

第六節 自動裝配源碼理解

tips&#xff1a;不同版本代碼實現有差異。 前面兩章了解的流程&#xff0c;就是 SpringBoot 自動轉配的核心。 一、自動裝配 1.1 什么是 SpringBoot 自動裝配? 自動裝配是 Spring 框架用來減少配置的顯式需求而引入的一個特性&#xff0c;該特性通過 Autowired或者Resource…

Redis數據庫知識點

Redis set get del keys redis中有哪些數據類型 string 最大512m key層級 redis的key允許有多個單詞形成層級結構&#xff0c;多個單詞之間用‘:’隔開 set get del keys hash 本身在redis中存儲方式就為key-value, 而hash數據結構中value又是一對key-value hset key …

【easyx】快速入門——彈球小游戲(第一代)

目錄 1.需求 2.運動的小球 3.碰到邊緣反彈 4.圓周撞擊或越過邊界反彈 5.繪制和移動擋板 6.小球碰到擋板反彈 7.游戲失敗時該如何處理 8.隨機初始條件 9.完整代碼 我們這一節將結合動畫和鍵盤交互的知識來做一個小游戲 1.需求 我們先看需求:小球在窗體內運動,撞到除…

從入門到精通:詳解Linux環境基礎開發工具的使用

前言 在這篇文章中&#xff0c;我將深入學習和理解Linux環境基礎開發工具的使用。無論你是初學者還是有一定經驗的開發者&#xff0c;相信這篇文章都會對你有所幫助。我們將詳細講解軟件包管理器、編輯器、編譯器、調試器、自動化構建工具以及版本控制工具的使用。 Linux軟件…

后端數據庫開發JDBC編程Mybatis之用基于XML文件的方式映射SQL語句實操

之前的SQL語句是基于注解 以后開發中一般是一個接口對應一個映射文件 書寫映射文件 基本結構 框架 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.or…

盡在掌握:Android 13 通知新功能詳解

盡在掌握&#xff1a;Android 13 通知新功能詳解 在移動應用開發中&#xff0c;通知扮演著至關重要的角色&#xff0c;它如同應用程序與用戶之間的橋梁&#xff0c;及時傳遞關鍵信息&#xff0c;提升用戶體驗。Android 13 作為最新的安卓版本&#xff0c;在通知方面帶來了諸多…

Rom應用開發遇到得一些小bug

記錄一些細碎得bug ROM時間類問題 問題描述&#xff1a; 設備拔電重啟&#xff0c;ROM時間為默認時間如1970年1月1日&#xff0c;與某些業務場景互斥 問題原因&#xff1a; 后臺接口校驗https證書校驗失敗&#xff0c;要求是2年內得請求頭校驗了時間戳&#xff0c;時間戳過期…

QLExpress入門及實戰總結

文章目錄 1.背景2.簡介3.QLExpress實戰3.1 基礎例子3.2 低代碼實戰3.2.1 需求描述3.2.1 使用規則引擎3.3.2 運行結果 參考文檔 1.背景 最近研究低代碼實現后端業務邏輯相關功能&#xff0c;使用LiteFlow作為流程編排后端service服務, 但是LiteFlow官方未提供圖形界面編排流程。…

使用RAG和文本轉語音功能,我構建了一個 QA 問答機器人

節前&#xff0c;我們星球組織了一場算法崗技術&面試討論會&#xff0c;邀請了一些互聯網大廠朋友、參加社招和校招面試的同學. 針對算法崗技術趨勢、大模型落地項目經驗分享、新手如何入門算法崗、該如何準備、面試常考點分享等熱門話題進行了深入的討論。 匯總合集&…