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();