一.文件/文件夹
1.1 检查存在(创建/删除)
//检查文件存在
if(QFile::exists(outputPath))
{
QFile file(outputPath);
file.remove();//存在则删除
}
//检查文件夹存在
QDir dir(m_sPathIn);
if(!dir.exists()) dir.mkdir(m_sPathOut);//不存在则创建
1.2 QFileDialog选择文件/文件夹
A.设置默认路径(从配置文件获取)
QSettings setting("./Setting.ini", QSettings::IniFormat);//QSettings记录一些程序中的信息
QString lastPath = setting.value("Process/Src").toString();//获取上次的打开路径
QFileDialog fileDialog(this);
fileDialog.setWindowTitle(QString("请选择图像文件"));//设置窗口的标题
fileDialog.setNameFilter("图像文件(*.png *.jpg *.tif)"); //设置一个过滤器
fileDialog.setDirectory(lastPath);
B.选择文件
if (fileDialog.exec() == QDialog::Accepted) {//弹出对话框
QStringList strPathList = fileDialog.selectedFiles();
if (strPathList.size() > 0) {
QString sPath = strPathList.at(0);
//ui->lineEdit_Src->setText(sPath);
//setting.setValue("Process/Src", sPath);
}
}
C.选择文件夹
QString sPath = QFileDialog::getExistingDirectory(this, QString("选择文件夹"), sPath);//"/" 第三个参数可为上次路径
1.3 打开文件/文件夹
QDesktopServices::openUrl(QUrl::fromLocalFile(sPath));
1.出现过打开QString+QString::fromLocal8Bit,打开失败问题。
1.4 文件重命名
f.rename(str_dir + "/" + str);
1.5 遍历文件夹QDir(文件过滤)
//示例一 获取文件夹下的文件名
foreach(QString fileName,dir.entryList(QDir::Files))
//示例二 获取两级文件夹下的文件夹/文件
QFileInfoList infoList = dir.entryInfoList(dir.filter() | QDir::NoDotAndDotDot);//过滤器值按位或运算符组合
foreach(QFileInfo fileInfo, infoList) {
if (fileInfo.isDir())
{
dir.setPath(fileInfo.filePath());//若是文件则为上级目录+“/..”
dir.setNameFilters(QStringList() << "*.tif" << "*.jpg" << "*.png");//filter 文件过滤
//dir.setSorting(QDir::DirsFirst);// 优先显示目录
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);//筛选文件夹
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);//筛选文件
}
dir.cd("tool");//QDir切换到下级tool目录
dir.cdUp();//QDir切换到上级目录
}
dir.entryInfoList(dir.filter() | QDir::NoDotAndDotDot | QDir::Files);//两个|不能过滤掉文件(测试无效)
1.6 QFileInfo
filePath() //可能为“/.”和“/…”。
二.txt
2.1 读取
QString sPathTxt = sPath+QString("/FrameInfo.txt");
QFile fileTxt(sPathTxt);
//方式一 有txt文件
if(fileTxt.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream txtInput(&fileTxt);//D:/Code/QListView/debug/COM_3/模板/鼠脑.txt
QString lineStr;
bool bHaveValue = false;
while(!txtInput.atEnd())
{
lineStr = txtInput.readLine();
QStringList sList=lineStr.split(' ');//按空格分隔 10 42 50 46 51
}
fileTxt.close();
}
2.2 写入(追加/覆盖)
m_mutex.lock();
file.open(QIODevice::WriteOnly);//不存在则创建,默认覆盖 | QIODevice::Append
//file.open(QIODevice::WriteOnly | QIODevice::Append);//文末追加,不存在则创建
QTextStream text_stream(&file);
text_stream<< str3 << '\t' << sText << endl;//换行亦可<<"\r\n"
file.flush();
file.close();
m_mutex.unlock();
三.过滤,排序
3.1 过滤,排序
QFileInfoList infoList = dir.entryInfoList(dir.filter()|QDir::NoDotAndDotDot);//过滤(./..) 按位或运算
QFileInfoList infoList = dir.entryInfoList(dir.filter()|QDir::NoDotAndDotDot,QDir::Time);//测试无效
//dir.setSorting(QDir::DirsFirst);// 优先显示目录
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs);//筛选文件夹
QFileInfoList infoList2 = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files);//筛选文件
Qt拖入多个文件并排序(std::sort)
virtual void dragEnterEvent(QDragEnterEvent *event) override {
const QMimeData *mimeData = event->mimeData();
if (mimeData->hasUrls()) {
QList<QUrl> urls = mimeData->urls();
std::sort(urls.begin(), urls.end(), [](const QUrl &a, const QUrl &b) {
return a.toString() < b.toString();
});
for (const QUrl &url : urls) {
QListWidgetItem *item = new QListWidgetItem(url.toLocalFile(), this);
}
}
}
四.其它
4.1 获取exe所在路径
main.cpp中头文件全局变量比main函数先初始化,若已运行QApplication app(argc, argv); 则可调用
QString sPath = QApplication::applicationDirPath();
QString sPath2 = QCoreApplication::applicationDirPath();
若未运行,通过新建文件夹的默认路径获取。
QString path = QDir::currentPath();//运行目录(调试时bin目录,不是release目录)
4.2 foreach遍历QFileInfoList和双层for循环拼接文件名速度比较
循环里不加读取Mat时,双层for循环更快。
循环里加读取Mat时,双层for循环所用时间约为1.5倍。

本文介绍Qt中文件及文件夹的基本操作方法,包括文件的创建、删除、重命名,以及如何使用QFileDialog进行文件和文件夹的选择。同时探讨了QDir的功能,如遍历文件夹、文件过滤等,并提供了实用的代码示例。
2301

被折叠的 条评论
为什么被折叠?



