我構建了一個大樹,其分支從磁盤加載,這個操作需要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()));
,但我不能使它發揮作用。
我迷失在細節中,還是我在完全錯誤的道路上?
如果性能是很重要的,你的做法會不會根據定義足夠快。你需要以不同的方式實現你的樹視圖,Qt提供了這樣的框架。它稱爲「模型/視圖架構」。你可以參考這個教程的細節:http://qt-project.org/doc/qt-4.8/modelview.html – vahancho