如何将树形文件夹显示到QT树视图

问题描述 投票:0回答:1

有时我需要备份文件,如果某个目录中的所有文件太大,每次备份该目录中的所有文件将需要相当长的时间。所以我发现how-can-i-check-if-the-content-of-a-folder-was-changed检查文件夹中的内容是否发生更改的最快方法是什么与我的需求类似。我看到有人建议使用FileSystemWatcher,但似乎需要运行后台,所以这似乎不是一个好的选择。

所以我想使用Qt(版本6.5.1)编写一个应用程序,可以找到一段时间内更改的目录和文件,以便使用Qt GUI显示。

我发现make-tree-folder-from-qtreeview-or-qtreewidget似乎满足我的需求,但它作为exe应用程序运行,原始代码无法在Qt(版本6.5.1)上运行,我只是更改

appendToModel(&model, name.split("/", QString::SkipEmptyParts), size);

appendToModel(&model, name.split("/", Qt::SkipEmptyParts), size);

所以就变成这样了:

#include <QApplication>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QStandardItemModel>
#include <QTreeView>
#include <QFileIconProvider>



QStandardItem * findChilItem(QStandardItem *it, const QString & text){
    if(!it->hasChildren())
        return nullptr;
    for(int i=0; i< it->rowCount(); i++){
        if(it->child(i)->text() == text)
            return it->child(i);
    }
    return nullptr;
}

static void appendToModel(QStandardItemModel *model, const QStringList & list, const QString & size){
    QStandardItem *parent = model->invisibleRootItem();
    QFileIconProvider provider;

    for(QStringList::const_iterator it = list.begin(); it != list.end(); ++it)
    {
        QStandardItem *item = findChilItem(parent, *it);
        if(item){
            parent = item;
            continue;
        }
        item = new QStandardItem(*it);
        if(std::next(it) == list.end()){
            item->setIcon(provider.icon(QFileIconProvider::File));
            parent->appendRow({item, new QStandardItem(size)});
        }
        else{
            item->setIcon(provider.icon(QFileIconProvider::Folder));
            parent->appendRow(item);
        }
        parent = item;
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QStandardItemModel model;
    model.setHorizontalHeaderLabels({"Name", "Size"});
    const std::string json = R"([
                             {"name": "/folder1/file1.txt";"size": "1KB"},
                             {"name": "/folder1/file2.txt";"size": "1KB"},
                             {"name": "/folder1/sub/file3.txt";"size": "1KB"},
                             {"name": "/folder2/file4.txt";"size": "1KB"},
                             {"name": "/folder2/file5.txt";"size": "1KB"}
                             ])";

    QJsonParseError parse;
    // The string is not a valid json, the separator must be a comma
    // and not a semicolon, which is why it is being replaced
    QByteArray data = QByteArray::fromStdString(json).replace(";", ",");
    QJsonDocument const& jdoc =  QJsonDocument::fromJson(data, &parse);
    Q_ASSERT(parse.error == QJsonParseError::NoError);
    if(jdoc.isArray()){
        for(const QJsonValue &element : jdoc.array() ){
            QJsonObject obj = element.toObject();
            QString name = obj["name"].toString();
            QString size = obj["size"].toString();
            appendToModel(&model, name.split("/", Qt::SkipEmptyParts), size);
        }
    }

    QTreeView view;
    view.setModel(&model);
    view.show();
    return a.exec();
}

现在它可以在我的电脑上运行了:

但是当我将上面的代码添加到我的编写代码时,我收到错误:

我不知道如何解决这个问题,并且这个错误似乎没有给我更多的错误详细信息。

但是当我在下面注释行时,程序可以编译。

appendToModel(&model, name.split("/", Qt::SkipEmptyParts), size);

现在可以编译了,但是无法修正在QTreeview中显示树形文件夹的问题(如果有其他控件可以解决这个问题,也可以使用。)见下图:

我希望下面的“Before”的 QTreeview 可以像下面的“Now”的 QTreeview 或上面的应用程序(应用程序名为:TestTreeView)运行结果一样显示正确的结果。

我该如何解决这个问题?谢谢你。

c++ qt linker qmake qtreeview
1个回答
0
投票

我自己解决了这个问题,现在可以按照我的预期正确显示了。

© www.soinside.com 2019 - 2024. All rights reserved.