Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从文件路径的QStringList创建QStandardItemModel 我对C++和QT很陌生,似乎找不到正确的解决办法。我想使用QStandardItemModel创建QTreeView。我有一个文件/文件夹路径列表(在QStringList中),其格式如下: Arena/Main/00078/a.txt Arena/Main/00080/b.txt Arena/Main/00080/collision/c.txt Arena/Main/00080/light/d.txt Arena/Main/00081/e.txt Characters/f.txt Characters/Main/g.txt Characters/Main/someFolder/h.txt_C++_Qt_Qtreeview_Qstandarditemmodel - Fatal编程技术网

如何从文件路径的QStringList创建QStandardItemModel 我对C++和QT很陌生,似乎找不到正确的解决办法。我想使用QStandardItemModel创建QTreeView。我有一个文件/文件夹路径列表(在QStringList中),其格式如下: Arena/Main/00078/a.txt Arena/Main/00080/b.txt Arena/Main/00080/collision/c.txt Arena/Main/00080/light/d.txt Arena/Main/00081/e.txt Characters/f.txt Characters/Main/g.txt Characters/Main/someFolder/h.txt

如何从文件路径的QStringList创建QStandardItemModel 我对C++和QT很陌生,似乎找不到正确的解决办法。我想使用QStandardItemModel创建QTreeView。我有一个文件/文件夹路径列表(在QStringList中),其格式如下: Arena/Main/00078/a.txt Arena/Main/00080/b.txt Arena/Main/00080/collision/c.txt Arena/Main/00080/light/d.txt Arena/Main/00081/e.txt Characters/f.txt Characters/Main/g.txt Characters/Main/someFolder/h.txt,c++,qt,qtreeview,qstandarditemmodel,C++,Qt,Qtreeview,Qstandarditemmodel,我以前使用过QFileSystemModel,并创建了实际的临时目录,作为一种解决方法,在列表中进行迭代: QDir dir(temp_path); if (!dir.exists(dir_string)){ dir.mkpath(dir_string); } QFile file(filepath_str); file.open(QIODevice::WriteOnly); 这给了我这样一个工作结果: 但是,该列表最多

我以前使用过QFileSystemModel,并创建了实际的临时目录,作为一种解决方法,在列表中进行迭代:

   QDir dir(temp_path);
    if (!dir.exists(dir_string)){
         dir.mkpath(dir_string);
    }
        
    QFile file(filepath_str);
    file.open(QIODevice::WriteOnly);
这给了我这样一个工作结果:


但是,该列表最多可以包含10000多个文件,这使它成为一个较长的向后解决方案。我想使用从路径列表创建的QStandardItemModel以类似的方式填充QTreeView。

您可以将创建的路径存储在如下地图中:

Arena/Main/00078/a.txt
Arena/Main/00080/b.txt
Arena/Main/00080/collision/c.txt
Arena/Main/00080/light/d.txt
Arena/Main/00081/e.txt
Characters/f.txt
Characters/Main/g.txt
Characters/Main/someFolder/h.txt
主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMap>
#include <QStandardItemModel>

class QStandardItem;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void addPathRecusively(const QStringList &path_parts, QStandardItem *parent, int layer = 1);

    QMap<QString, QStandardItem*> path_item_map_;
    QStandardItemModel model_;
};
#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
类标准项;
类主窗口:公共QMainWindow
{
Q_对象
公众:
主窗口(QWidget*parent=nullptr);
~main窗口();
私人:
循环无效添加路径(常量QStringList和路径_部分,QStandardItem*父项,int层=1);
QMap路径\项目\地图\地图;
QStandarditem模型;
};
#endif//main窗口
mainwindow.cpp

#include "mainwindow.h"

#include <QStringList>
#include <QTreeView>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QStringList filenames =
    {
        "Arena/Main/00078/a1.txt",
        "Arena/Main/00078/a2.txt",
        "Arena/Main/00080/b.txt",
        "Arena/Main/00080/collision/c.txt",
        "Arena/Main/00080/light/d.txt",
        "Arena/Main/00081/e1.txt",
        "Arena/Main/00081/e2.txt",
        "Arena/Main/00081/e3.txt",
        "Characters/f.txt",
        "Characters/Main/g.txt",
        "Characters/Main/someFolder/h.txt",
    };

    for (auto &filename : filenames)
    {
        QStringList parts = filename.split("/");
        parts.pop_back();
        addPathRecusively(parts, model_.invisibleRootItem());
    }

    QTreeView *view = new QTreeView{this};
    view->setModel(&model_);
    this->setCentralWidget(view);
    this->resize(500, 500);
}

MainWindow::~MainWindow()
{
}

void MainWindow::addPathRecusively(const QStringList &path_parts, QStandardItem *parent, int layer)
{
    QStringList path_parts_to_layer;
    std::copy(path_parts.begin(), path_parts.begin() + layer, std::back_inserter(path_parts_to_layer));
    QString path = path_parts_to_layer.join("/");
    auto item = path_item_map_.value(path);
    if (item == nullptr)
    {
        item = new QStandardItem{path_parts_to_layer.last()};
        path_item_map_.insert(path, item);
        parent->appendRow({item, new QStandardItem});
    }

    if (path_parts.length() == layer)
    {
        auto file_count_index = model_.indexFromItem(item).siblingAtColumn(1);
        model_.setData(file_count_index, file_count_index.data().toInt() + 1, Qt::DisplayRole);
    }
    else
        addPathRecusively(path_parts, item, layer + 1);
}
#包括“mainwindow.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
{
QStringList文件名=
{
“Arena/Main/00078/a1.txt”,
“Arena/Main/00078/a2.txt”,
“Arena/Main/00080/b.txt”,
“Arena/Main/00080/collision/c.txt”,
“Arena/Main/00080/light/d.txt”,
“Arena/Main/00081/e1.txt”,
“Arena/Main/00081/e2.txt”,
“Arena/Main/00081/e3.txt”,
“字符/f.txt”,
“Characters/Main/g.txt”,
“Characters/Main/someFolder/h.txt”,
};
用于(自动文件名:文件名(&F)
{
QStringList parts=filename.split(“/”);
parts.pop_back();
重复添加路径(零件,型号\不可见项目());
}
QTreeView*view=新的QTreeView{this};
查看->设置模型(&model_);
此->设置中心Widget(视图);
这->调整大小(500500);
}
MainWindow::~MainWindow()
{
}
void主窗口::重复添加路径(常量QStringList和路径_部分,QStandardItem*父级,int层)
{
QStringList路径\u零件\u到\u层;
std::copy(path_parts.begin(),path_parts.begin()+层,std::back_插入器(path_parts_to_层));
QString路径=路径到层。连接(“/”;
自动项目=路径\项目\映射\值(路径);
如果(项目==空PTR)
{
item=new QStandardItem{path_parts_to_layer.last()};
路径\项目\映射\插入(路径,项目);
父->追加行({item,new QStandardItem});
}
if(路径\零件长度()=层)
{
自动文件\计数\索引=模型\索引fromItem(item).siblingAtColumn(1);
model_u.setData(file_count_index,file_count_index.data().toInt()+1,Qt::DisplayRole);
}
其他的
重复添加路径(路径\部件、项目、层+1);
}

谢谢!这对我很有效。我在理解递归方面遇到了一些困难。