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,源码下载:
全套专栏源码下载地址: