如何在用户点击分支时逐步构建Qt树小部件

How to build a Qt tree widget step by step, when the user clicks on the branches?

本文关键字:构建 Qt 小部 用户 分支      更新时间:2023-10-16

我构建了一棵大树,其分支是从磁盘加载的,这个操作需要 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 column)。我会尝试这样的事情:

connect(yourTree, SIGNAL(itemClicked()), yourTree, SLOT(AddSubTree()));
你必须对 TreeWidget 进行子类化,

并使 AddSubTree(QTreeWidgetItem* item, int column) 成为该子类的插槽。然后在 AddSubTree 中,检查列号是否正确,如果是,则将相应的子树添加到参数项中。

您可能希望移植到QAbstractItemModelQTreeView

实现QAbstractItemModel以返回数据并使用canFetchMore(QModelIndex&)fetchMore进行实际提取的位置