目录
2、getFileOnDirectory函数,遍历指定文件夹的一级子文件
4、QTreeWidgetItem::setData()用法
如图所示,这里仅仅实现展示目录结构,对于新增文件、修改文件、删除文件会后续补充。
思路:这里我并没有在程序打开的时候就遍历全部的文件,因为文件太多了,全部遍历一遍需要较多的时间,导致运行程序后一时半会打不开(正在遍历全部的文件)。所以我这里采用的是:点击左侧箭头展开时,遍历一层文件。下面举例说明
第一个图是最初的情况,程序运行时只获取全部的盘符,以及这些盘符的一级子文件。如果只获取盘符,不获取一级子文件,那么左侧的箭头就不会出现。
当我们点击F盘左侧箭头展示时,如第二个图所示,这时需要的操作是:把F盘的一级子文件中是文件夹的选择出来,遍历每一个文件夹中的文件(不需要递归,一层就够)。比如获取到BaiduNetdiskDownload文件夹下的一级子文件。下面来看看具体代码实现
1、获取盘符,以及一级子文件
void MainWindow::initTreeWidget()
{
ui->treeWidget->setHeaderLabel("目录结构:");
QFileInfoList fileInfoList = QDir::drives(); // 获取全部的盘符
// 循环遍历每一个盘符,获取这些盘符下的一级子文件
for(QFileInfo fileInfo : fileInfoList) {
QTreeWidgetItem* item = new QTreeWidgetItem(); // 子节点
item->setText(0,fileInfo.path()); // 设置显示的内容,比如显示“C:/”。
// 设置自定义数据,后续要用。每个节点要保存自身的路径,不包括自身文件名
item->setData(0,Qt::UserRole,fileInfo.path());
// 为false时,点击展开会获取子文件,然后改为ture,再次展开就不用添加了
item->setData(0,Qt::UserRole+1,false); // 设置自定义数据
ui->treeWidget->addTopLevelItem(item); // 把节点添加到根上
getFileOnDirectory(item,item->text(0)); // 获取指定目录下的一级子文件
}
}
2、getFileOnDirectory函数,遍历指定文件夹的一级子文件
void MainWindow::getFileOnDirectory(QTreeWidgetItem* item,QString directoryPath)
{
// 创建目录对象,获取该目录下的全部文件(一级)
QDir dir(directoryPath);
QFileInfoList fileInfoList = dir.entryInfoList();
// 循环遍历,给传入的item节点添加子节点
for(QFileInfo fileInfo : fileInfoList) {
if(fileInfo.fileName()=="." || fileInfo.fileName()=="..")
continue;
QTreeWidgetItem* child = new QTreeWidgetItem();
child->setText(0,fileInfo.fileName()); // text标签显示文件名
child->setData(0,Qt::UserRole,directoryPath); // 记录路径
child->setData(0,Qt::UserRole+1,false); // 记录没有展开过
item->addChild(child); // 添加到item节点上
}
}
3、绑定展开信号和槽函数,遍历指定文件
connect(ui->treeWidget,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(expandItem(QTreeWidgetItem*)));
void MainWindow::expandItem(QTreeWidgetItem* item)
{
if(item->data(0,Qt::UserRole+1).toBool()) // 为true,已经添加过了,不用再添加了
return;
item->setData(0,Qt::UserRole+1,true);
// 遍历item节点的全部子节点,如果该子节点目录是文件夹,就获取到里面的文件
for(int i=0;i<item->childCount();i++) {
QTreeWidgetItem* root = item->child(i); // 子节点
// 获取到子节点的路径,拼接上子节点自身文件名,判断是否为文件夹
QString file = root->data(0,Qt::UserRole).toString()+"/"+root->text(0);
QFileInfo* fileInfo = new QFileInfo(file);
if(fileInfo->isDir()) {
getFileOnDirectory(root,file); // 是文件夹就获取里面的文件,添加子节点
}
}
}
4、QTreeWidgetItem::setData()用法
void QTreeWidgetItem::setData(int column, int role, const QVariant &value)
1、第一个参数是列索引,QTreeWidgetItem可以有多列数据,每一列数据对应一个索引值,索引值从0开始递增。
2、第二个参数是角色,也就是数据的含义。QT预定义的角色有:Qt::DisplayRole(用于显示的角色)、Qt::EditRole(用于编辑的角色)、Qt::UserRole(用户自定义的角色)等。如果还需要更多的用户自定义角色,可以使用Qt::UserRole加上偏移用来区分不用的角色。
3、第三个参数是数据,QVariant支持很多种数据类型,可以直接传入。
4、获取data中的数据。QVariant data(int column, int role),传入对应的索引值和角色就可以获取到设置的数据,然后用to...函数把数据转为想要的数据类型。(下图截取了部分)
标签:控件,遍历,QT,文件,QTreeWidgetItem,item,TreeWidget,节点,Qt From: https://blog.csdn.net/Zhang_Y_Q/article/details/136596469