gpt4 book ai didi

qt - 从绝对文件路径使用分层结构填充 QTreeWidget

转载 作者:行者123 更新时间:2023-12-04 22:49:36 30 4
gpt4 key购买 nike

我有一个文件,其中列出了绝对文件路径,每行 1 个。列出的文件是按顺序排列的,因此例如所有文件/Documents/ dir 将在文件中列在彼此之后。

我想要做的是将所有这些文件放在 QTreeWidget 中在一个很好的层次结构中,就像一个普通的文件系统。我将如何从我拥有的绝对路径文件中做到这一点?

这是我在这方面编码的程度:

QFile file(FILENAME_ENCRYPTED);
QString line;
QDir dir;

QTreeWidgetItem *item;
if (file.open(QIODevice::ReadOnly)) {
QTextStream stream( &file );
do {
line = stream.readLine();
if (!line.isNull()) {
dir = QDir(line);
item = new QTreeWidgetItem();
item->setText(0, dir.dirName());
this->ui->treeWidget->addTopLevelItem(item);
}
} while (!line.isNull());
}
file.close();

这工作正常,但它只列出彼此之后的所有文件名。我想我必须做一些递归函数,但递归不是我最好的 friend ,我更喜欢迭代!有人能给我一个正确的方向吗? :)

最佳答案

不需要递归。您可以使用 QString::split()基于分隔符(即“/”)将文件路径拆分为 QStringList 中单独的 QString,然后遍历每个 QString 以确定文件结构。

编辑:这是一个例子:

#include <QtGui>

const QString s1 = "Docs/Testing/textFile1.txt";
const QString s2 = "Docs/Testing/textFile2.txt";
const QString s3 = "Docs/Testing/textFile3.txt";
const QString s4 = "Docs/Testing/AnotherFolder/textFile4.txt";
const QString s5 = "ThisIsGonnaBeCrazy/WholeNewFolder/AndAnother/file.pdf";
const QString s6 = "ThisIsGonnaBeCrazy/file.doc";

class MainWindow : public QMainWindow
{
public:
MainWindow()
{
QTreeWidget *treeWidget = new QTreeWidget;

QStringList fileNames;
fileNames << s1 << s2 << s3 << s4 << s5 << s6;

QTreeWidgetItem *topLevelItem = NULL;
foreach (const QString &fileName, fileNames)
{
QStringList splitFileName = fileName.split("/");

// add root folder as top level item if treeWidget doesn't already have it
if (treeWidget->findItems(splitFileName[0], Qt::MatchFixedString).isEmpty())
{
topLevelItem = new QTreeWidgetItem;
topLevelItem->setText(0, splitFileName[0]);
treeWidget->addTopLevelItem(topLevelItem);
}

QTreeWidgetItem *parentItem = topLevelItem;

// iterate through non-root directories (file name comes after)
for (int i = 1; i < splitFileName.size() - 1; ++i)
{
// iterate through children of parentItem to see if this directory exists
bool thisDirectoryExists = false;
for (int j = 0; j < parentItem->childCount(); ++j)
{
if (splitFileName[i] == parentItem->child(j)->text(0))
{
thisDirectoryExists = true;
parentItem = parentItem->child(j);
break;
}
}

if (!thisDirectoryExists)
{
parentItem = new QTreeWidgetItem(parentItem);
parentItem->setText(0, splitFileName[i]);
}
}

QTreeWidgetItem *childItem = new QTreeWidgetItem(parentItem);
childItem->setText(0, splitFileName.last());
}

setCentralWidget(treeWidget);
}
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

请注意,您可以使用 QTreeWidgetItem::setData()如果您愿意,可以为每个文件设置文件名。不过,我的示例并没有这样做。

关于qt - 从绝对文件路径使用分层结构填充 QTreeWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348801/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com