QT (四)模型/视图 QFileSystemModel,QStringListModel,QStandardItemModel

  • 思考:QTableWidget 在某种程度上可以等价为QStandardItemModel,同理,其他的功能也有类似的等价,但是以当前的QTableWidget QStandardItemModel为例的话,两者都是用于实现建立表格的相关组件,只不过QStandardItemModel使用更为灵活,可以自定义自己的模型

QFileSystemModel,list,view,tree view应用于文件模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 知识点:下列案例是QFileSystemModel文件模型的应用
#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 slots:
    void on_treeView_clicked(const QModelIndex &index);

private:
    Ui::MainWindow *ui;
    QFileSystemModel *model;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QDebug"

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

    //创建模型
    model = new QFileSystemModel;

    //设置文件系统模型的根目录
    //在这指定的目录下安装了一个文件系统监视器,这个目录下的文件信息的改变都会显示在这个模型里面
    model->setRootPath(QDir::currentPath());

    //关联模型和"视图"
    ui->treeView->setModel(model);
    ui->listView->setModel(model);
    ui->tableView->setModel(model);

    //list,tree,table是三种view,实现的功能是一样的,只是对当前文件系统的显示方式不一样
    //使用信号槽,通知其他视图的即使变化,实现3种view同步变化
    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->labelFileName->setText(model->fileName(index));
    float size = model->size(index) /1024; //?k

    qDebug() << "size " << size;

    if(size >1024){
   
   
        ui->labelFileSize->setText(QString::asprintf("%.1f MB", size/1024.0)) ;
    }else
    {
   
   
        ui->labelFileSize->setText(QString::asprintf("%f kB", size)) ;
    }


    ui->labelNodeType->setText(model->type(index));
    ui->checkBox->setChecked(model->isDir(index));
    ui->labelFilePath->setText(model->filePath(index));



}

二 QStringListModel

  • 知识点:总结来说,模型的使用,包括以下几个步骤:

  • 在.h文件中,定义模型指针 QStringListModel *model;;

  • 在cpp文件的构造函数中,构建模型model= new QStringListModel;

  • 构造数据/导入数据, QStringList addrList = {"北京","上海","广州","深圳","贵州","杭州","深圳"}; model->setStringList(addrList);

  • 模型和组件的关联 ui->listView->setModel(model);

在这里插入图片描述

  • 数据添加完毕后,让鼠标选中新添加的数据新型显示
    ui->listView->setCurrentIndex(index);
#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 slots:
    void on_pushButtonEndAdd_clicked();

    void on_pushButtonInsert_clicked();

    void on_pushButtonDelete_clicked();

    void on_pushButtonClear_clicked();

    void on_pushButtonInit_4_clicked();

    void on_pushButtonInit_3_clicked();

    void on_pushButtonInit_2_clicked();

private:
    Ui::MainWindow *ui;
    QStringListModel *model;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    //创建模型
    model= new QStringListModel;

    //构造数据/导入数据
    QStringList addrList = {
   
   "北京","上海","广州","深圳","贵州","杭州","深圳"};
    model->setStringList(addrList);

    //关联
    ui->listView->setModel(model);
    ui->tableView->setModel(model);

}

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


void MainWindow::on_pushButtonEndAdd_clicked()
{
   
   
    //在尾部插入一行
    model->insertRow(model->rowCount());

    QModelIndex index = model->index(model->rowCount()-1,0); //获取最后一行第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);

}

void MainWindow::on_pushButtonDelete_clicked()
{
   
   
    QModelIndex index = ui->listView->currentIndex();
    model->removeRow(index.row());
}

void MainWindow::on_pushButtonClear_clicked()
{
   
   
   model->removeRows(0,model->rowCount());
}

void MainWindow::on_pushButtonInit_4_clicked()
{
   
   
    QStringList list = model->stringList();

    ui->plainTextEdit->clear();
    for(int i = 0; i < list.count(); i++){
   
   
        ui->plainTextEdit->appendPlainText(list[i]);
    }
}

void MainWindow::on_pushButtonInit_3_clicked()
{
   
   
    ui->plainTextEdit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值