2012-04-27 12 views
4

絶対ファイルパスが1行に1つずつあるファイルがあります。リストされたファイルは順番に並べられています。 /Documents/ dirは、ファイル内で互いに後でリストされます。QTreeWidgetに絶対ファイルパスの階層構造を設定してください

私がしたいのは、通常のファイルシステムのように、すべてのファイルを素敵な階層構造で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(); 

これは正常に動作しますが、それだけでお互いの後にすべてのファイル名を一覧表示します。私はいくつかの再帰的な関数を行う必要があると思いますが、再帰は私の親友ではありません、私は反復を好む!誰かが私に正しい方向へのプッシュを与えることができますか? :)

答えて

9

再帰は必要ありません。 QString::split()を使用すると、ファイルパスを区切り文字( "/")に基づいてQStringList内の別々のQStringに分割し、各QStringを繰り返してファイル構造を判断できます。

EDIT:あなたはあなたが好きな場合は、各ファイルのファイル名を設定するQTreeWidgetItem::setData()を使用することができます

#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(); 
} 

注:ここでは一例です。私の例はそれをしません。

+0

ああ、完璧、ありがとう!私は今理解していると思う! – Bazze

+0

スプリット操作は遅くありませんか? – user1767754

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は、ファイルパスを反復するために使用されるものであるため、iはループから欠落している、あなたのツリーウィジェットの名前で「packageTreeWidget」を置き換えます、私はzipのようなパッケージファイルの内容を表示するためにこれを使用しています。

関連する問題