二十八、目录操作 QDir
简单的QDir小例子
cpp
#include <QCoreApplication>
#include <QDir>
#include <QStringList>
#include <QDebug>
// 定义一个函数,输入一个目录路径,返回该目录及其子目录中所有文件的大小
qint64 getDirFileInfoSizeFunc(const QString &qpath)
{
// 创建一个QDir对象,用于操作目录
QDir dir(qpath);
// 初始化大小为0
qint64 size = 0;
// 遍历目录中的所有文件
foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
{
// 将每个文件的大小累加到size
size = size + fileInfo.size();
}
// 遍历目录中的所有子目录
foreach(QString strDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{
// 对每个子目录递归调用getDirFileInfoSizeFunc函数,并将结果累加到size
size = size + getDirFileInfoSizeFunc(qpath + QDir::separator() + strDir);
}
// 定义一个字符变量用于存储单位('B'代表字节,'K'代表千字节,'M'代表兆字节,'G'代表吉字节)
char uint = 'B';
// 计算并存储当前目录的大小(以适当的单位表示)
qint64 currentDirSize = size;
if (currentDirSize > 1024)
{
currentDirSize = currentDirSize / 1024;
uint = 'K';
if (currentDirSize > 1024)
{
currentDirSize = currentDirSize / 1024;
uint = 'M';
if (currentDirSize > 1024)
{
currentDirSize = currentDirSize / 1024;
uint = 'G';
if (currentDirSize > 1024)
{
currentDirSize = currentDirSize / 1024;
uint = 'T';
}
}
}
}
// 使用qDebug()函数打印目录大小和路径(注意:此功能可能仅在调试版本中可用)
qDebug() << "目录占据空间为:" << currentDirSize << "\t" << qPrintable(qpath);
// 返回目录大小(以字节为单位)
return size;
}
int main(int argc, char *argv[])
{
// 创建一个QCoreApplication对象,这是Qt的核心部分,用于处理事件循环等操作
QCoreApplication a(argc, argv);
// 定义一个QString变量,用于存储当前路径(即当前目录的路径)
QString strPath;
// 使用QDir::currentPath()函数获取当前路径,并存储到strPath变量中
strPath = QDir::currentPath();
// 使用qDebug()函数打印当前路径(注意:此功能可能仅在调试版本中可用)
qDebug() << "当前目录为:" << strPath << endl;
// 调用getDirFileInfoSizeFunc函数,并传入当前路径作为参数,
//打印出当前目录及其子目录的大小信息(以适当的单位表示)
getDirFileInfoSizeFunc(strPath);
// 进入事件循环,等待事件处理(例如用户输入等)并返回退出码(0表示正常退出)
return a.exec();
}
这段代码的主要目的是获取指定目录及其子目录中所有文件的大小,并以适当的单位(如字节、千字节、兆字节、吉字节)显示出来。
代码流程如下:
- 在
getDirFileInfoSizeFunc
函数中,首先创建一个QDir
对象,用于操作目录。然后初始化大小为0。 - 遍历目录中的所有文件,并将每个文件的大小累加到
size
变量。 - 遍历目录中的所有子目录,并对每个子目录递归调用
getDirFileInfoSizeFunc
函数,将结果累加到size
变量。 - 根据文件大小,计算出以适当单位表示的目录大小。这里使用了一些基本的数学计算,包括除法和比较。
- 使用
qDebug()
函数打印目录大小和路径(注意:此功能可能仅在调试版本中可用)。 - 返回目录大小(以字节为单位)。
在main
函数中,首先创建了一个QCoreApplication
对象,这是Qt的核心部分,用于处理事件循环等操作。然后获取当前路径,并存储到strPath
变量中。接着调用getDirFileInfoSizeFunc
函数,传入当前路径作为参数,打印出当前目录及其子目录的大小信息(以适当的单位表示)。最后进入事件循环,等待事件处理并返回退出码
QFileInfoList QDir::entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const:
返回目录中所有文件和目录的QFileInfo对象列表,根据先前使用setNameFilters()和setFilter()设置的名称和属性过滤器排序,并根据setSorting()设置的标志排序。
可以使用nameFilters、filters和sort参数覆盖名称筛选器、文件属性筛选器和排序规范。
如果目录不可读、不存在或没有任何内容与规范匹配,则返回空列表。
Filters
QChar QDir::separator():
返回本机目录分隔符:Unix下为"/",Windows下为"\"。
您不需要使用此函数来构建文件路径。如果你总是使用"/",Qt会翻译你的路径以符合底层操作系统。如果您希望使用用户操作系统的分隔符显示路径,请使用toNativeSeparators()。
综合例子
dialog.h
cpp
// 如果没有定义名为DIALOG_H的头文件,则定义它
#ifndef DIALOG_H
#define DIALOG_H
// 引入QDialog类,使得我们可以使用QDialog的功能
#include <QDialog>
// 引入QListWidget类,这是一个可以显示列表的控件
#include<QListWidget>
// 引入QListWidgetItem类,这是QListWidget中的每一项
#include<QListWidgetItem>
// 引入QLineEdit类,这是一个文本输入框
#include<QLineEdit>
// 引入QDir类,这是一个用于操作目录的类
#include<QDir>
// 引入QFileInfoList类,这是一个用于存储文件信息列表的类
#include<QFileInfoList>
// 引入QVBoxLayout类,这是一个垂直布局管理器
#include<QVBoxLayout>
// 引入QStringList类,这是一个用于存储字符串列表的类
#include<QStringList>
// 引入Qt的命名空间,这样我们就可以直接使用Qt库中的类而不需要加前缀Qt
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; } // 声明一个名为Dialog的类,这个类在Qt Designer中定义了UI界面
QT_END_NAMESPACE
// 定义一个名为Dialog的类,这个类继承自QDialog
class Dialog : public QDialog
{
Q_OBJECT // 使用Qt的宏,表示这个类支持Qt的信号和槽机制
public:
// 构造函数,接受一个QWidget类型的父对象指针作为参数,初始化为nullptr
Dialog(QWidget *parent = nullptr);
// 析构函数
~Dialog();
// 定义一个方法dispFileInfoList,接受一个QFileInfoList类型的参数list,用于显示文件信息列表
void dispFileInfoList(QFileInfoList list);
private:
// 声明一个指向Ui命名空间下的Dialog类的指针ui,用于访问UI界面元素
Ui::Dialog *ui;
// 声明一个QLineEdit类型的指针fileLineEdit,可能用于输入文件名或路径
QLineEdit *fileLineEdit;
// 声明一个QListWidget类型的指针fileListWidget,可能用于显示文件列表
QListWidget *fileListWidget;
// 声明一个QVBoxLayout类型的指针vbl,可能用于布局管理
QVBoxLayout *vbl;
public slots: // 定义public槽函数,这些槽函数可以响应Qt的信号事件
// 定义一个名为dispDir的槽函数,接受一个QDir类型的参数dir,可能用于显示目录信息或进行目录操作
void dispDir(QDir dir);
// 定义一个名为dispDirShow的槽函数,接受一个QListWidgetItem类型的参数item,可能用于在文件列表中选择项目时的操作
void dispDirShow(QListWidgetItem *item);
}; // 类定义结束
#endif // DIALOG_H // 如果之前没有定义DIALOG_H头文件,则在这里结束定义
dialog.cpp
cpp
// 引入"dialog.h"头文件,该文件可能包含了Dialog类的声明和部分实现
#include "dialog.h"
// 引入"ui_dialog.h"头文件,该文件可能包含了与Dialog类相关的UI界面元素
#include "ui_dialog.h"
// Dialog类的构造函数
Dialog::Dialog(QWidget *parent)
: QDialog(parent) // 初始化基类QDialog,设置父对象为传入的QWidget指针
, ui(new Ui::Dialog) // 初始化ui指针,指向Ui命名空间下的Dialog类对象
{
ui->setupUi(this); // 使用ui对象设置UI界面
resize(500,350); // 设置对话框的大小为500x350像素
fileLineEdit=new QLineEdit("/"); // 创建一个文本输入框,初始内容为"/"
fileListWidget=new QListWidget; // 创建一个列表控件
vbl=new QVBoxLayout(this); // 创建一个垂直布局管理器,并将其设置为对话框的布局
vbl->addWidget(fileLineEdit); // 将文本输入框添加到布局中
vbl->addWidget(fileListWidget); // 将列表控件添加到布局中
// 连接文本输入框的returnPressed信号到dispdir(QDir)槽函数
connect(fileLineEdit,SIGNAL(returnPressed()),this,SLOT(dispdir(QDir)));
// 连接列表控件的itemDoubleClicked信号到dispDirShow(QListWidgetItem *)槽函数
connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem *)),this,SLOT(dispDirShow(QListWidgetItem *)));
QString root="/"; // 设置根目录为"/"
QDir rootDir(root); // 创建一个QDir对象,表示根目录
QStringList strList; // 创建一个字符串列表
strList<<"*"; // 向列表中添加一个通配符"*"
QFileInfoList list=rootDir.entryInfoList(strList); // 获取根目录下的文件和目录列表
dispFileInfoList(list); // 显示文件和目录列表
}
// Dialog类的析构函数
Dialog::~Dialog()
{
delete ui; // 删除ui指针指向的对象,释放内存
}
// 显示文件和目录列表的函数
void Dialog::dispFileInfoList(QFileInfoList list)
{
fileListWidget->clear(); // 清空列表控件的内容
for(unsigned int i=0;i<list.count();i++) // 遍历文件和目录列表
{
QFileInfo tempFileInfo=list.at(i); // 获取当前项的文件信息
if(tempFileInfo.isDir()) // 如果当前项是一个目录
{
QIcon ico("D:/dir.jpg"); // 创建一个图标对象,指向目录图片文件"D:/dir.jpg"
QString fileName=tempFileInfo.fileName(); // 获取目录的名称
QListWidgetItem *temp=new QListWidgetItem(ico,fileName); // 创建一个列表控件项,设置图标和名称
fileListWidget->addItem(temp); // 将新项添加到列表控件中
}
else if(tempFileInfo.isFile()) // 如果当前项是一个文件
{
QIcon ico("D:/file.jpg"); // 创建一个图标对象,指向文件图片文件"D:/file.jpg"
QString fileName=tempFileInfo.fileName(); // 获取文件的名称
QListWidgetItem *temp=new QListWidgetItem(ico,fileName); // 创建一个列表控件项,设置图标和名称
fileListWidget->addItem(temp); // 将新项添加到列表控件中
}
}
}
// Dialog类的dispDir函数,用于显示目录内容
void Dialog::dispDir(QDir dir)
{
// 创建一个QStringList,并添加一个通配符"*"
QStringList list;
list << "*";
// 从给定的目录中获取所有条目信息,包括文件和子目录,按名称排序,且优先显示目录
QFileInfoList fileInfo = dir.entryInfoList(list, QDir::AllEntries, QDir::DirsFirst);
// 调用dispFileInfoList函数,显示文件信息列表
dispFileInfoList(fileInfo);
}
// Dialog类的dispDirShow函数,用于根据选择的列表项显示目录内容
void Dialog::dispDirShow(QListWidgetItem *item)
{
// 创建一个QDir对象
QDir dir;
// 获取选择的列表项的文本
QString str = item->text();
// 设置QDir对象的路径为fileLineEdit文本框的内容
dir.setPath(fileLineEdit->text());
// 进入由列表项文本指定的子目录
dir.cd(str);
// 将fileLineEdit文本框的内容设置为当前目录的绝对路径
fileLineEdit->setText(dir.absolutePath());
// 调用dispDir函数,显示当前目录的内容
dispDir(dir);
}
这段代码是使用C++和Qt库编写的,主要目的是创建一个对话框(Dialog),用于显示一个目录下的文件和子目录列表。下面是代码的详细解释:
-
引入所需的头文件:
#include "dialog.h"
:引入dialog.h
头文件,该文件可能包含了Dialog
类的声明和部分实现。#include "ui_dialog.h"
:引入ui_dialog.h
头文件,该文件可能包含了与Dialog
类相关的UI界面元素。
-
定义
Dialog
类的构造函数:Dialog::Dialog(QWidget *parent)
:构造函数,初始化Dialog
对象。ui->setupUi(this);
:使用ui
对象设置UI界面。resize(500,350);
:设置对话框的大小为500x350像素。- 创建文本输入框(文件路径输入框)和列表控件。
- 创建垂直布局管理器,并将文本输入框和列表控件添加到布局中。
- 连接文本输入框的
returnPressed()
信号到dispdir(QDir)
槽函数。 - 连接列表控件的
itemDoubleClicked(QListWidgetItem *)
信号到dispDirShow(QListWidgetItem *)
槽函数。 - 设置根目录为"/",并获取根目录下的文件和目录列表。
- 显示文件和目录列表。
-
定义
Dialog
类的析构函数:Dialog::~Dialog()
:析构函数,删除ui
指针指向的对象,释放内存。
-
定义显示文件和目录列表的函数:
void Dialog::dispFileInfoList(QFileInfoList list)
:遍历文件和目录列表,并显示在列表控件中。
-
定义
dispDir
函数,用于显示目录内容:void Dialog::dispDir(QDir dir)
:从给定的目录中获取所有条目信息,并调用dispFileInfoList
函数显示文件信息列表。
-
定义
dispDirShow
函数,用于根据选择的列表项显示目录内容:void Dialog::dispDirShow(QListWidgetItem *item)
:根据选择的列表项的文本,进入指定的子目录,并调用dispDir
函数显示当前目录的内容。
这段代码的主要功能是创建一个文件和目录浏览对话框,用户可以通过输入框输入目录路径,然后浏览该目录下的文件和子目录,并在列表控件中选择子目录以进一步浏览。
void QLineEdit::returnPressed():
这个信号在按下回车键时发出。注意,如果在行编辑上设置了validator()或inputMask(),则只有当输入遵循inputMask()并且validator()返回QValidator::Acceptable时才会发出returnPressed()信号。
void QListWidget::itemDoubleClicked(QListWidgetItem *item):
当在小部件中的一个项目上双击鼠标按钮时,该信号与指定的项目一起发出。