2012-04-27 48 views
4

我有一個文件,其中列出了絕對路徑,每行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中的單獨QStrings中,然後迭代每個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()爲每個文件,如果你想設置的文件名。不過,我的例子並沒有這樣做。

+0

啊,完美,謝謝!我想我現在明白了! – Bazze 2012-04-27 18:42:45

+0

拆分操作不慢嗎? – user1767754 2015-10-13 03:22:59

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; 
    } 
} 

索引「我」從環缺失,因爲是我用來遍歷文件路徑,用你的樹部件的名稱取代「packageTreeWidget」的人,我正在使用它來顯示壓縮包文件的內容。