Qt:使用Model/View进行和数据和视图的分离

本文介绍了Qt中Model/View的概念,包括FileSystemModel用于处理文件系统的模型,StringListModel适用于管理一维字符串数据,以及StandardItemModel用于管理二维数据的模型。通过这些模型,可以实现数据和视图的分离。
摘要由CSDN通过智能技术生成

三种model/iew

FileSystemModel

文件系统模型顾名思义用于文件系统

  1. 创建model指针
  2. 使用指针接收创建好的对象
  3. 将视图设置相应的模型
#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   
    ui->setupUi(this);

    model=new QFileSystemModel(this); //QFileSystemModel提供单独线程,推荐使用
    model->setRootPath(QDir::currentPath()); //设置根目录

    ui->treeView->setModel(model); //设置数据模型
    ui->listView->setModel(model); //设置数据模型
    ui->tableView->setModel(model); //设置数据模型

//信号与槽关联,treeView单击时,其目录设置为listView和tableView的根节点
    connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
            ui->listView,SLOT(setRootIndex(QModelIndex)));

    connect(ui->treeView,SIGNAL(clicked(QModelIndex)),
            ui->tableView,SLOT(setRootIndex(QModelIndex)));
}

MainWindow::~MainWindow()
{
   
    delete ui;
}

void MainWindow::on_treeView_clicked(const QModelIndex &index)
{
   
    ui->chkIsDir->setChecked(model->isDir(index));//设置标签
    ui->LabPath->setText(model->filePath(index));//设置标签
    ui->LabType->setText(model->type(index));//设置标签
    ui->LabFileName->setText(model->fileName(index));//设置标签

    int sz=model->size(index)/1024;//转换大小
    if (sz<1024)
        ui->LabFileSize->setText(QString("%1 KB").arg(sz));
    else
        ui->LabFileSize->setText(QString::asprintf("%.1f MB",sz/1024.0));
}

StringListModel

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
   
    ui->setupUi(this);

    QStringList  theStrList; //初始化字符数组
    theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"山东"<<"四川"<<"重庆"<<"广东"<<"河南"; //追加内容

    theModel=new QStringListModel(this); //创建数据模型
    theModel->setStringList(theStrList); //导入字符数组的内容
    ui->listView->setModel(theModel); //为listView设置数据模型

    ui->listView->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::SelectedClicked);//设置触发
}

Widget::~Widget()
{
   
    delete ui;
}

void Widget::on_listView_clicked(const QModelIndex &index)
{
    //显示QModelIndex的行、列号
    ui->LabInfo->setText(QString::asprintf("当前项:row=%d, column=%d",
                        index.row(),index.column()));
}

void Widget::on_btnIniList_clicked()
{
    //重新载入theStrList的内容,初始化theModel的内容
    QStringList         theStrList; //保存初始 StringList
    theStrList<<"北京"<<"上海"<<"天津"<<"河北"<<"山东"<<"四川"<<"重庆"<<"广东"<<"河南"; //初始化 StringList
    theModel->setStringList(theStrList);
}

void Widget::on_btnTextClear_clicked()
{
    //清除plainTextEdit的文本
    ui->plainTextEdit->clear();
}

void Widget::on_btnTextImport_clicked()
{
   // 显示数据模型的StringList
    QStringList tmpList;
    tmpList=theModel->stringList();//获取数据模型的StringList

    ui->plainTextEdit->clear(); //文本框清空
    for (
Qt中的Model/View是一种基于MVC(Model-View-Controller)设计模式的实现方式。Model/View架构将数据的存储和显示分离开来,使得程序的结构更加清晰,并且可以提高程序的可维护性和可扩展性。 在Qt中,Model/View是面向对象的。它由三个基础类组成:QAbstractItemModel、QAbstractTableModel和QAbstractListModel。QAbstractItemModel为QAbstractTableModel和QAbstractListModel提供了接口规范,使用它可以将数据模型与View分离开来。QAbstractTableModel主要为表格型数据模型定义了一套标准。QAbstractListModel与之类似,为列表型数据模型定义了一套标准。 在Model/View中,Model提供了从数据源中获取数据并将其封装成数据项及其属性的方式。而View根据Model提供的数据项及其属性,对其进行可视化展示。对于数据的修改和删除等操作,则通过View传递给Model进行实现。 Model数据来源可以是任何类型的数据,例如数据库、XML文件、内存中的数据等等。ModelView之间的通信是通过信号和槽机制来实现的。当Model数据发生变化时,它会发出数据变化的信号,View会从这些信号中得知数据发生了哪些改变,然后对其进行更新。 Model/View提供了一种灵活、高效、可扩展的方案来处理数据。在Qt中,开发者可以使用其提供的各种ModelView类,或者继承这些类来实现自己的数据模型和视图类,以便更好地满足自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值