Как пошагово построить виджет дерева Qt, когда пользователь нажимает на ветки?

Я построил большое дерево, ветви которого загружаются с диска. Операция занимает 5 минут. Чтобы ускорить его, я хочу загружать только те деревья, которые пользователь выбирает в графическом интерфейсе.

Это текущий код, который загружает все сразу:

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

Решение

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

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

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

2

Другие решения

вы можете захотеть портировать на QAbstractItemModel и QTreeView

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

1

По вопросам рекламы [email protected]