模型和視圖
- 一.模型和視圖的概念
- 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.模型索引
這個信號的參數就是一個模型索引,在視圖中,我們可以通過模型索引來對模型進行操作。
比如說我們希望ListView和TableView跟隨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,就大功告成了。文本清空按鈕,那么簡單,自己做。
四.總結
模型有很多種,我這里只先簡單了講了文件系統模型和字符串鏈表模型.通過學習,我們要重點的掌握數據,模型,視圖之間的關系。
慌了,你就慢下來,還慌,你就停下來!