qt qml listview加载日志目录菜单及显示日志文件

qt qml listview加载日志目录菜单及显示目录下日志文件

*在qml中直接访问本地电脑的文件比较麻烦,使用qml listview配合c++,通过后台QList生成listview所需ListModel折腾很久,还要实现目录加载和文件清单加载,内存管理也是个麻烦事。后面考虑在后台生成json内容,提供给前台qml使用,比较轻巧的方式,实现了目录菜单展开和关闭,目录下日志文件的显示。然后在qml中加载日志文件显示也比较麻烦,遇到一些问题,比如要通过XMLHttpRequest方式加载文件,日志文件内容如何自动换行,汉字乱码等,最终还算得到了解决。希望能对需要的人有所帮助。

下面展示一些代码`。
C++头文件

#ifndef FOLDERLISTDATAPROVIDER_H
#define FOLDERLISTDATAPROVIDER_H

#include <QObject>
#include <QMap>
#include <QVariant>

class FolderlistDataProvider : public QObject
{
    Q_OBJECT
    public:
        explicit FolderlistDataProvider(QObject *parent = nullptr);
        //通过Q_INVOKABLE方式提供前端qml调用
        Q_INVOKABLE QVariantMap getCategoryData(QString path);
    signals:
};

#endif // FOLDERLISTDATAPROVIDER_H

C++代码文件

#include "folderlistdataprovider.h"
#include <QJsonObject>
#include <QJsonArray>
#include <QDir>

FolderlistDataProvider::FolderlistDataProvider(QObject *parent) : QObject(parent)
{

}

QVariantMap FolderlistDataProvider::getCategoryData(QString path){
    QDir directory(path);
    // 检查目录是否存在
    if (!directory.exists()) {
        qDebug() << "日志目录不存在: " << path;
        return QVariantMap();
    }
    // 设置过滤器仅包含目录
    directory.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
    // 设置按名称排序
    directory.setSorting(QDir::Name | QDir::Reversed);
    // 获取目录列表
    QFileInfoList dirList = directory.entryInfoList();
    // 创建一个 QVariantList 并将类别添加到其中
    QVariantList categoriesList;
    // 遍历目录列表并输出目录路径
    foreach (const QFileInfo& dirInfo, dirList) {
        QJsonObject categoryObject;
        categoryObject["category"] = dirInfo.fileName();
        categoryObject["expand"] = false;
        QDir subDirectory(dirInfo.absoluteFilePath());
        if (!subDirectory.exists()){
            qDebug() << "子目录不存在: " << dirInfo.absoluteFilePath();