问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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都能提供跨平台、高性能的解决方案。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号