C++ 当用户单击分支时,如何逐步构建Qt树小部件?

C++ 当用户单击分支时,如何逐步构建Qt树小部件?,c++,qt,tree,qtreewidget,C++,Qt,Tree,Qtreewidget,我构建了一棵大树,它的分支是从磁盘加载的,这个操作需要5分钟才能完成。为了加快速度,我只想加载用户从GUI中选择的子树 这是当前代码,一次加载所有内容: int MyWidget::AddSubtree(QTreeWidgetItem *_projectItem, const QString &_filePath) { const QString currentPrj = _projectItem->text(0);

我构建了一棵大树,它的分支是从磁盘加载的,这个操作需要5分钟才能完成。为了加快速度,我只想加载用户从GUI中选择的子树

这是当前代码,一次加载所有内容:

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()));
但我不能让它工作。

我是迷失在细节中,还是走错了方向?

我想您可能正在从QTreeWidget中查找单击的信号项(QTreeWidgetItem*item,int列)。我想试试这样的东西:

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

您必须对TreeWidget进行子类化,并使AddSubTree(QTreeWidgetItem*item,int列)成为该子类的一个槽。然后在AddSubTree中,检查列号是否正确,如果正确,则将相应的子树添加到参数项。

我认为您可能正在从QTreeWidget中查找已单击的信号项(QTreeWidgetItem*项,int列)。我想试试这样的东西:

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

您必须对TreeWidget进行子类化,并使AddSubTree(QTreeWidgetItem*item,int列)成为该子类的一个槽。然后在AddSubTree中,检查列号是否正确,如果正确,则将相应的子树添加到参数项。

您可能希望移植到a和a
QTreeView


当您实现返回数据并使用
canFetchMore(QModelIndex&)
fetchMore
执行实际提取时

您可能希望移植到a和a
QTreeView


当您实现返回数据并使用
canFetchMore(QModelIndex&)
fetchMore
执行实际提取时

如果性能很重要,您的方法根据定义将不够快。您需要以不同的方式实现树视图,而Qt提供了这样的框架。它被称为“模型/视图体系结构”。您可以参考本教程了解详细信息:如果性能很重要,您的方法根据定义将不够快。您需要以不同的方式实现树视图,而Qt提供了这样的框架。它被称为“模型/视图体系结构”。有关详细信息,请参阅本教程: