Qt文件系统引擎高效开发技巧分享
创作时间:
作者:
@小白创作中心
Qt文件系统引擎高效开发技巧分享
引用
CSDN
等
12
来源
1.
https://blog.csdn.net/mtyxb/article/details/138462954
2.
https://blog.csdn.net/qq_41301277/article/details/136471237
3.
https://cloud.baidu.com/article/3044387
4.
https://blog.csdn.net/A_zyx0808/article/details/144860446
5.
https://blog.csdn.net/mtyxb/article/details/137397949
6.
https://blog.csdn.net/hsyhd/article/details/138064706
7.
https://www.cnblogs.com/ybqjymy/p/18261233
8.
https://developer.aliyun.com/article/1463744
9.
https://www.cnblogs.com/feiyangqingyun/p/18118601
10.
https://www.cnblogs.com/apachecn/p/18343124
11.
https://www.cnblogs.com/tingtaishou/p/18221911
12.
https://www.cnblogs.com/feiyangqingyun/p/18279687
在跨平台应用程序开发中,文件系统操作是不可或缺的基础功能。Qt框架提供了强大的文件系统引擎,通过QFile、QDir、QFileSystemModel等类,开发者可以轻松实现文件读写、目录操作、文件系统模型管理等功能。本文将分享一些实用的Qt文件系统引擎开发技巧,帮助你更高效地完成项目开发任务。
01
核心类介绍
QFile:文件操作的基础类
QFile类提供了基本的文件操作功能,如打开、关闭、读取和写入文件。以下是一个使用QFile读取和修改文件内容的示例:
#include <QFile>
#include <QString>
#include <QStringList>
#include <QTextStream>
int main()
{
QString filePath = "example.txt";
QFile fileRead(filePath); // 先读取文件信息,QIODevice::Text能将换行转为\n
QString arryRead;
if (fileRead.open(QIODevice::ReadOnly | QIODevice::Text)) {
arryRead = fileRead.readAll();
}
fileRead.close();
QStringList arryListWrite = arryRead.split("\n"); // 存储每一段信息
QFile fileWrite(filePath);
if (fileWrite.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream streamWrite(&fileWrite); // 通过文本流控制文件写操作
for (int i = 0; i < arryListWrite.size() - 1; i++)// 这里到arryListWrite.size()-1是因为arryListWrite数组按照\n分 段时,最后一行尾部有个\n,所以数组最后一个值为空,需要将它去掉
{
if (arryListWrite.at(i).startsWith("0 "))
{
QString contentWrite = arryListWrite.at(i);
contentWrite.replace(0, 2, "");
streamWrite << contentWrite << "\n";
}
else
{
streamWrite << arryListWrite.at(i) << "\n";
}
}
}
fileWrite.close();
}
QDir:目录操作的利器
QDir类提供了处理目录和文件路径的方法。以下是一些常用的QDir使用技巧:
- 路径拼接:使用
QDir::separator()
获取当前操作系统的路径分隔符,确保在不同平台上都能正确拼接路径。
QString path = QDir::currentPath() + QDir::separator() + "1.txt";
- 路径规范化:使用
QDir::cleanPath()
方法消除不同操作系统下路径差异。
QString cleanPath = QDir::cleanPath(QDir::currentPath());
- 获取工作目录和运行目录:使用
QDir::currentPath()
获取当前工作目录,使用QCoreApplication::applicationDirPath()
获取可执行文件所在目录。
QString currentPath = QDir::currentPath();
QString appPath = QCoreApplication::applicationDirPath();
- 获取文件信息:结合QFileInfo类获取文件的详细信息。
QString filePath = "E:/App/Resources/Config/Version.ini";
QFileInfo fileInfo(filePath);
QString fileName = fileInfo.fileName(); // 文件名: Version.ini
QString suffix = fileInfo.suffix(); // 后缀名: ini
QString path = fileInfo.absolutePath(); // 绝对路径: E:/App/Resources/Config/
QFileSystemModel:文件系统模型管理
QFileSystemModel类用于提供文件系统数据的模型,常用于实现文件管理器等应用。以下是一些使用技巧:
- 节点遍历:通过递归函数遍历所有节点。
void ParamSettingDlg::GetNode()
{
for(int i = 0;i < model->rowCount() ;i++)
{
QStandardItem *item = model->item(i);
qDebug() <<"item = " << item->text();
GetItem(model->item(i) );
}
}
void ParamSettingDlg::GetItem(QStandardItem *item)
{
Q_ASSERT(item);
if(item->hasChildren())
{
for(int i = 0;i < item->rowCount() ;i++)
{
QStandardItem * childitem = item->child(i);
qDebug() << "childitem = " << childitem->text();
GetItem(childitem);
}
}
}
- 设置当前选中项:使用
setCurrentIndex
方法。
for(int i = 0;i < standardModel_down->rowCount() ;i++)
{
QStandardItem *item = standardModel_down->item(i);
Q_ASSERT(item);
if(item->hasChildren())
{
for(int i = 0;i < item->rowCount() ;i++)
{
QStandardItem * childitem = item->child(i);
qDebug() << "childitem = " << childitem->text();
if(childitem->text() == fileName1)
{
ui->treeView_down->setCurrentIndex(childitem->index());
}
}
}
qDebug() <<"item = " << item->text();
}
- 数据检索:使用QSortFilterProxyModel代理类进行过滤和排序。
m_model = new QStandardItemModel(ui->treeView);//模型
m_pFilterModel = new QSortFilterProxyModel(ui->treeView);//过滤模型
m_pFilterModel->setSourceModel(m_model);
m_pFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); // 大小写不敏感
m_pFilterModel->setAutoAcceptChildRows(true); // 父项满足时不过滤子项
m_pFilterModel->setRecursiveFilteringEnabled(true); // 递归匹配满足的子节点,父类可见
// 指定初始化过滤列
m_pFilterModel->setFilterKeyColumn(0);
ui->treeView->setModel(m_pFilterModel);
02
最佳实践
跨平台开发注意事项
Qt的一大优势是跨平台支持,但在文件系统操作中仍需注意以下几点:
- 使用
QDir::separator()
处理路径分隔符 - 使用
QDir::toNativeSeparators()
将路径转换为本地系统格式 - 避免硬编码路径,使用相对路径或配置文件
性能优化建议
- 使用
QFile::open()
时指定正确的访问模式,避免不必要的缓冲 - 大文件操作时使用
QFile::readLine()
逐行读取,避免一次性加载整个文件 - 使用
QDir::entryList()
时指定过滤器,减少不必要的文件检索
错误处理和异常情况
- 使用
QFile::error()
检查文件操作错误 - 使用
QDir::exists()
检查目录是否存在 - 使用
QFileInfo
类检查文件属性,如权限、大小等
Qt文件系统引擎提供了强大的功能和灵活的API,通过掌握这些核心类的使用技巧,开发者可以更高效地完成文件系统相关的开发任务。无论是开发文件管理器、系统工具还是其他需要文件操作的应用,Qt都能提供跨平台、高性能的解决方案。
热门推荐
一生气就触发咳嗽?警惕5种疾病来“拜访”!
10部豆瓣9.0分以上的动画电影推荐,部部都是神作!
门徒效应:如何成为超级学习者
博尔特9秒58的纪录何时能打破?科学家:未来人类能跑进9秒
夜班族的痛:上班想睡觉,下班睡不着
墙面铺钉钢丝网(钢丝网的作用及防止开裂的办法)
代替绝缘胶布
如何按照劳动法合规裁员
壮观!长江江苏段出现鲢鳙阵,大鱼肥如猪,老渔政:30年未见此景
如何点石成金?张掖临泽给出参考答案
基本面选股:原理、指标与实践
中国易经风水大师领军人物,曾仕强已经离世,无量子隐居山林
【乒乓球教学】乒乓球技巧详解 业余选手提高乒乓球技巧的3要3不要
男子网购平板电脑,拆封后申请退货遭拒!一公司被罚
什么叫“神通”?
烦人的“过敏性鼻炎”又来了!学会这几招,有效预防少受罪
虚幻引擎 游戏开发基础
做完手术为什么要放两包盐?原理和注意事项全解析
外交家张骞:虽两次出使西域皆失败,但却开拓了丝绸之路
3D Mapping的实时交互技术:增强观众参与感
帮人按摩技巧:从准备工作到结束按摩的全程指南
恩次方梦境解码:长期做梦对健康的影响
蓝色调的柔和色彩 — 完美展现宁静优雅的视觉效果
扁平足怎么锻炼?6种有效方法改善足弓形态
无线键鼠选蓝牙还是2.4G:双方各有什么优缺点 一文读懂
数字中轴·文化过大年”圆满落幕:传统与科技交融,中轴线焕发新活力
FAA与eVTOL适航认证:历史、意义与影响(附文件包)
脑出血和脑中风有什么区别
像videos这样的视频内容,如何选择和观看?
虚拟机如何选磁盘类型