从QTreeView或QTreeWidget创建树文件夹
从RESTAPI读取文件夹树,然后将它们显示给用户 调用API后的json响应示例:从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
[
{"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如下图所示:
有两个选项:
不要使用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好的,解决问题,很抱歉给您带来不便。如果我们一起聊天,您有空吗?