【qt】初识模型和视图

【qt】初识模型和视图

码农世界 2024-05-24 前端 69 次浏览 0个评论

模型和视图

  • 一.模型和视图的概念
    • 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 
                #include //文件系统模型头文件
                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.模型索引

                这个信号的参数就是一个模型索引,在视图中,我们可以通过模型索引来对模型进行操作。

                比如说我们希望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后得到是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 
                #include //字符串链表模型
                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
                        ui->plainTextEdit->appendPlainText(list[i]);
                    }
                }
                

                运行结果:

                OK,就大功告成了。文本清空按钮,那么简单,自己做。

                四.总结

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

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

转载请注明来自码农世界,本文标题:《【qt】初识模型和视图》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,69人围观)参与讨论

还没有评论,来说两句吧...

Top