2013-09-26 15 views
0

我構建了一個大樹,其分支從磁盤加載,這個操作需要5分鐘才能完成。爲了加快速度,我只想加載用戶從GUI中選擇的子樹。如何在用戶點擊分支時一步一步地構建Qt樹窗口小部件?

這是當前的代碼,加載所有的一切在一次:

int MyWidget::AddSubtree(QTreeWidgetItem *_projectItem, 
         const QString &_filePath) 
{ 
    const QString currentPrj = _projectItem->text(0); 
    QDir* rootDir = new QDir(_filePath); 
    QFileInfoList filesList = rootDir->entryInfoList(); 

    filesList = rootDir->entryInfoList(); 

    foreach(QFileInfo fileInfo, filesList) 
    { 
     if(fileInfo.isDir()) 
     { 
      const QString job = fileInfo.fileName(); 

      QTreeWidgetItem* jobItem = new QTreeWidgetItem(); 
      jobItem->setText(0, job); 

      //+P Performance critical! Do it on demand 
      AddSubSubtree(jobItem, fileInfo.filePath()); 

      _projectItem->addChild(jobItem); 
     } 
    } 

    return 0; 
} 


int MyWidget::AddSubSubtree(QTreeWidgetItem *_jobItem, 
          const QString &_filePath) 
{ 
    const QString currentJob = _jobItem->text(0); 
    QDir* rootDir = new QDir(_filePath); 
    rootDir->cd("subDir"); 

    // Retrieve the runs 

    filesList = rootDir->entryInfoList(); 

    foreach(QFileInfo fileInfo, filesList) 
    { 
     if(fileInfo.isDir()) 
     { 
      const QString run = fileInfo.fileName(); 

      QTreeWidgetItem* runItem = new QTreeWidgetItem(); 
      runItem->setText(0, run); 

      _jobItem->addChild(runItem); 
     } 
    } 

    return 0; 
} 

我想這樣做是爲了刪除性能臨界線(以下// + P),並調用AddSubSubtree()在用戶單擊相應的父分支時在單個子子樹上。

如何檢測特定的父分支已被點擊?

我知道我需要在AddSubtree是這樣的:

connect(jobItem, SIGNAL(triggered()), this, SLOT(AddSubSubtree())); 

,但我不能使它發揮作用。
我迷失在細節中,還是我在完全錯誤的道路上?

+0

如果性能是很重要的,你的做法會不會根據定義足夠快。你需要以不同的方式實現你的樹視圖,Qt提供了這樣的框架。它稱爲「模型/視圖架構」。你可以參考這個教程的細節:http://qt-project.org/doc/qt-4.8/modelview.html – vahancho

回答

2

我想你可能正在從QTreeWidget中尋找信號itemClicked(QTreeWidgetItem * item,int column)。我想嘗試這樣的:

connect(yourTree, SIGNAL(itemClicked()), yourTree, SLOT(AddSubTree())); 

你不得不繼承TreeWidget並AddSubTree(QTreeWidgetItem *項目,INT列),該子類的插槽。然後在AddSubTree中,檢查列號是否正確,如果是這樣,則將相應的子樹添加到參數項目中。

相關問題