从QTreeView或QTreeWidget创建树文件夹

从QTreeView或QTreeWidget创建树文件夹,qt,treeview,qtreeview,qtreewidget,qtreewidgetitem,Qt,Treeview,Qtreeview,Qtreewidget,Qtreewidgetitem,从RESTAPI读取文件夹树,然后将它们显示给用户 调用API后的json响应示例: [ {"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.t

从RESTAPI读取文件夹树,然后将它们显示给用户

调用API后的json响应示例:

[
{"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"}
]
我只想让GUI如下图所示:

有两个选项:

  • QTreeView

  • QTreeWidget

  • 在这张照片中,我使用了QTreeWidget(带有静态数据)。 目前,我不知道该如何制作数据模型

    我制作了TreeModel来为QtreeView设置数据。 但当它们显示在GUI中时,所有数据都只显示在列名中。 我从你的电脑上复制了代码

    但现在我无法解决这个问题。我需要一个示例源代码。 另外,我也只想显示一个简单的树视图


    不要使用QFileSystem,因为数据来自RESTAPI。

    您需要做的是通过获取文件名和大小来解析json,然后使用“/”分隔名称,并以适当的方式将其添加到模型中

    #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("/", QString::SkipEmptyParts), size);
            }
        }
    
        QTreeView view;
        view.setModel(&model);
        view.show();
        return a.exec();
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    #包括
    QStandardItem*findchilitm(QStandardItem*it、const QString和text){
    如果(!it->hasChildren())
    返回空ptr;
    对于(int i=0;irowCount();i++){
    如果(it->child(i)->text()==text)
    返回->子对象(i);
    }
    返回空ptr;
    }
    静态无效附件模型(QStandardItemModel*模型、常量QStringList和list、常量QString和大小){
    QStandardItem*parent=model->invisibleRootItem();
    QFileIconProvider提供商;
    for(QStringList::const_迭代器it=list.begin();it!=list.end();+it)
    {
    QStandardItem*item=FindChilitm(父项,*it);
    如果(项目){
    父项=项目;
    继续;
    }
    项目=新的QS标准项目(*it);
    if(std::next(it)=list.end(){
    item->setIcon(provider.icon(QFileIconProvider::File));
    父项->追加行({item,new QStandardItem(size)});
    }
    否则{
    item->setIcon(provider.icon(QFileIconProvider::Folder));
    父->追加行(项目);
    }
    父项=项目;
    }
    }
    int main(int argc,char*argv[])
    {
    质量保证申请a(argc、argv);
    QS标准模型;
    setHorizontalHeaderLabels({“Name”,“Size”});
    const std::string json=R“([
    {“名称”:“/folder1/file1.txt”;“大小”:“1KB”},
    {“name”:“/folder1/file2.txt”;“size”:“1KB”},
    {“name”:“/folder1/sub/file3.txt”;“size”:“1KB”},
    {“name”:“/folder2/file4.txt”;“size”:“1KB”},
    {“名称”:“/folder2/file5.txt”;“大小”:“1KB”}
    ])";
    QJsonParseError解析;
    //字符串不是有效的json,分隔符必须是逗号
    //而不是分号,这就是它被替换的原因
    QByteArray数据=QByteArray::fromStdString(json)。替换(“;”,“,”);
    QJsonDocument const&jdoc=QJsonDocument::fromJson(数据和解析);
    Q_断言(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();
    附录模型(&model,name.split(“/”,QString::skipmptyparts),大小);
    }
    }
    QTreeView视图;
    view.setModel(&model);
    view.show();
    返回a.exec();
    }
    
    注意:分号不是json的有效分隔符,因此我必须更改它


    否。因为从REST ApiI获取的树文件夹数据将更新Question我更新了questionLet us。应用程序已崩溃。可能是因为if(!it->haschilds()处出现nullptr异常。它是null@kienbui好的,解决问题,很抱歉给您带来不便。如果我们一起聊天,您有空吗?