2013-09-26 7 views
0

Я построил большое дерево, ветви которого загружены с диска, операция, которая занимает 5 минут. Чтобы ускорить это, я хочу только загружать подделки, которые пользователь выбирает из графического интерфейса.Как построить виджет дерева 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

Я думаю, что вы можете искать сигнал itemClicked (QTreeWidgetItem * item, int column) из QTreeWidget. Я хотел бы попробовать что-то вроде:

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

Вы бы подкласс TreeWidget и сделать AddSubTree (QTreeWidgetItem * элемент, внутр столбец) слот этого подкласса. Затем в AddSubTree проверьте правильность номера столбца, и если это так, добавьте соответствующее поддерево в элемент аргумента.

1

Вы могли бы пожелать порта в QAbstractItemModel и QTreeView

где вы реализуете QAbstractItemModel вернуть данные и использовать canFetchMore(QModelIndex&) и fetchMore сделать фактическое извлечение