QTreeView使用总结19,添加、删除、清空功能示例

1,简介

本文介绍给Tree(Table代码类似)添加、删除、清空内容的操作代码。

示例使用本地文件进行添加数据,演示了通过文件选择对话框选择本地文件的方法,并且示范了如何保存上一次选择的路径,还对添加的文件做了防重处理。

2,效果

 

3,主要代码

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void InitTree();


private slots:
    void on_btnAdd_clicked();
    void on_btnDelete_clicked();
    void on_btnClear_clicked();

private:
    void AddFiles(QStringList files);
    QStringList GetExistFiles();

    QString GetLastDir();
    void SaveLastDir(QString dir);


private:
    Ui::MainWindow *ui;
    QStandardItemModel* mModel;
};

#endif // MAINWINDOW_H

MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QDir>
#include <QFileDialog>
#include <QSettings>
#include <QStandardPaths>
#include "head.h"

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

    InitTree();
}

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


void MainWindow::InitTree()
{
    QTreeView* t = ui->treeView;
    t->setEditTriggers(QTreeView::NoEditTriggers);        //不能编辑
    t->setSelectionBehavior(QTreeView::SelectRows);         //一次选中整行
    t->setSelectionMode(QTreeView::ExtendedSelection);
    t->setFocusPolicy(Qt::NoFocus);
    t->header()->setHighlightSections(false);
    t->header()->setStretchLastSection(true);
    t->header()->setDefaultAlignment(Qt::AlignCenter);

    QStringList header;
    header << "文件名" << "目录" << "文件尺寸" << "格式";

    mModel = new QStandardItemModel(this);
    mModel->setHorizontalHeaderLabels(header);
    t->setModel(mModel);

    t->header()->resizeSection(0, 200);
    t->header()->resizeSection(1, 300);
    t->header()->resizeSection(2, 100);
//    t->header()->resizeSection(3, 100);   //设了最后一行自动缩放
}

void MainWindow::on_btnAdd_clicked()
{
    //获取上次添加文件时选择的目录
    QString dir = GetLastDir();
    if (!QFile::exists(dir))
    {
        dir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation);
    }

    QFileDialog dlg(this, tr("选择文件"), dir, "");
    dlg.setFileMode(QFileDialog::ExistingFiles);
    dlg.setViewMode(QFileDialog::Detail);
    dlg.setNameFilter("所有格式(*.*)");
    //dlg.setNameFilter("文本文件(*.txt)");        //可设置过滤哪些文件格式
    if (dlg.exec())
    {
        QStringList files = dlg.selectedFiles();

        //保存本次打开的目录,下次选择文件时默认从这里选择
        QString dir = dlg.directory().absolutePath();
        SaveLastDir(dir);

        AddFiles(files);
    }
}

void MainWindow::on_btnDelete_clicked()
{
    //用一个map的key存储所有行号, value随便填, 两个作用:
    //1,map会自动排序,行号从低到高排列
    //2,去重
    QMap<int, int> mapRow;
    QModelIndexList indexes = ui->treeView->selectionModel()->selectedIndexes();
    foreach(QModelIndex index, indexes)
    {
        mapRow[index.row()] = 0;
    }
    //得到排序过的选中行列表
    QList<int> rows = mapRow.keys();

    //由于删除行会影响该行之后的行的索引变化,正向遍历删除会有问题,反向遍历就没事
    for (int i = rows.size() - 1; i >= 0; i--)
    {
        mModel->removeRow(rows.at(i));
    }
}

void MainWindow::on_btnClear_clicked()
{
    mModel->removeRows(0, mModel->rowCount());
}

void MainWindow::AddFiles(QStringList files)
{
    QStringList existFiles = GetExistFiles();
    for (QString file : files)
    {
        if (existFiles.contains(file))
        {
            continue;
        }
        QFileInfo fi(file);
        QString dir = fi.absoluteDir().absolutePath();

        QStandardItem* item1 = new QStandardItem(fi.fileName());
        QStandardItem* item2 = new QStandardItem(dir);
        QStandardItem* item3 = new QStandardItem(QString::number(fi.size()));
        QStandardItem* item4 = new QStandardItem(fi.suffix());
        item1->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
        item2->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
        item3->setTextAlignment(Qt::AlignCenter);
        item4->setTextAlignment(Qt::AlignCenter);

        //文件路径保存在item1的data里
        item1->setData(file, Qt::UserRole + 1);

        QList<QStandardItem*> items;
        items << item1 << item2 << item3 << item4 ;
        mModel->appendRow(items);
    }
}

QStringList MainWindow::GetExistFiles()
{
    //获取当前tree已添加的文件列表,防止重复文件
    QStringList files;
    for (int i = 0; i < mModel->rowCount(); i++)
    {
        QStandardItem* item = mModel->item(i, 0);
        if (item)
        {
            QString file = item->data(Qt::UserRole + 1).toString();
            files << file;
        }
    }
    return files;
}

QString MainWindow::GetLastDir()
{
    //存储上一次浏览文件夹时最后选择的目录,以供下次浏览时默认使用该目录
    QString strIni = QCoreApplication::applicationDirPath() + "/treedemo19.ini";
    QSettings s(strIni, QSettings::IniFormat);
    QString dir = s.value("/Main/LastDir", "").toString();
    return dir;
}

void MainWindow::SaveLastDir(QString dir)
{
    //存储上一次浏览文件夹时最后选择的目录,以供下次浏览时默认使用该目录
    QString strIni = QCoreApplication::applicationDirPath() + "/treedemo19.ini";
    QSettings s(strIni, QSettings::IniFormat);
    s.setValue("/Main/LastDir", dir);
}

4,源码下载:

全套专栏源码下载地址:

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆枫゛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值