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都能提供跨平台、高性能的解决方案。
热门推荐
男生摸耳朵是喜歡嗎?探究耳朵撫摸中的情感暗示
打鼾原因与解决方法:告别睡觉打呼噜的五大策略
张飞高八尺、关羽高九尺,这些都是真的吗
CBA新赛季巡礼之浙江队:本土球员实力出色 新三外援决定高度
什么是湿度以及湿度如何影响温度?
Win统如何解除安装软件限制?(电脑怎么解除软件安装限制)
一文读懂鼻中隔偏曲:从原因到治疗全解析
Windows 11系统下笔记本电脑合盖不休眠设置指南
显卡抗锯齿技术实战:MSAA、SSAA、FXAA 算法原理及性能对比
用5个字凝练有机化合物系统命名的主要原则
探究性实验的七大步骤
脚受伤出血怎么处理
每周这样吃饭,能改善脂肪肝?坚持这种饮食,能保护肝脏和改善代谢
孩子写字不好看?这样有效提升孩子的写字能力
魅力绽放,花语演绎(用花之美传递魅力与自信)
高档沙发布料有哪几种?高档沙发布料的种类与选择指南
开网店卖什么最赚钱?选择产品前你必须知道的五大要素
支付方式改革背景下,基本医保住院端DRG分组运行结果怎么样?
针灸治疗的适应症和注意事项
怎么走出严重绝望抑郁症
人到晚年才会明白:生一个孩子和生两三个孩子的差别,到底有多大
C语言static关键字详解:作用域与生命周期的深度解析
爱因斯坦日记中的中国印象:偏见与跨文化的思考
Windows 10开机进入安全模式的多种方法及注意事项
广东出发值得一去的自驾线路推荐,5条广东自驾到广西最佳线路攻略
如何优化性能测试流程和重点?全面解析!
中医治疗眩晕方法
休渔期也能"海鲜自由"!温州海鲜市场供应充足价格亲民
近一半城市正在下沉,天津排名第一,未来2.7亿人将面临风险
河道清淤公司如何保障施工质量?