2012-04-27 62 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”的人,我正在使用它来显示压缩包文件的内容。