5

1行に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();

これは正常に機能しますが、すべてのファイル名が次々に表示されるだけです。再帰関数を実行する必要があると思いますが、再帰は私の親友ではありません。反復が好きです。誰かが私に正しい方向へのプッシュを与えることができますか?:)

4

2 に答える 2

10

再帰は必要ありません。を使用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()必要に応じて、を使用して各ファイルのファイル名を設定できることに注意してください。しかし、私の例ではそれはできません。

于 2012-04-27T14:03:27.767 に答える
1

これは私のために働きます:

QStringList tokens = path.split ( '/' );

QTreeWidgetItem* treeWidgetItem = NULL;

for ( int32_t j = 0 ; j < packageTreeWidget->topLevelItemCount(); ++j )
{
    if ( packageTreeWidget->topLevelItem ( j )->text ( 0 ) == tokens.at ( 0 ) )
    {
        treeWidgetItem = packageTreeWidget->topLevelItem ( j );
        break;
    }
}

if ( treeWidgetItem == NULL )
{
    treeWidgetItem = new QTreeWidgetItem;
    treeWidgetItem->setText ( 0, tokens.at ( 0 ) );
    packageTreeWidget->addTopLevelItem ( treeWidgetItem );
}

for ( int32_t j = 1; j < tokens.size(); ++j )
{
    int32_t k;
    for ( k = 0 ; k < treeWidgetItem->childCount(); ++k )
    {
        if ( treeWidgetItem->child ( k )->text ( 0 ) == tokens.at ( j ) )
        {
            treeWidgetItem = treeWidgetItem->child ( k );
            break;
        }
    }
    if ( k == treeWidgetItem->childCount() )
    {
        QTreeWidgetItem* newTreeWidgetItem = new QTreeWidgetItem;
        newTreeWidgetItem->setText ( 0, tokens.at ( j ) );
        treeWidgetItem->addChild ( newTreeWidgetItem );
        treeWidgetItem = newTreeWidgetItem;
    }
}

インデックス「i」はループから欠落しています。これは、ファイルパスを反復処理するために使用したものであり、「packageTreeWidget」をツリーウィジェットの名前に置き換えます。これを使用して、zipのようなパッケージファイルの内容を表示しています。

于 2014-06-06T04:40:12.187 に答える