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()));

しかし、私はそれを機能させることはできません。
詳細に迷っていますか、それとも完全に間違った道を進んでいますか?

4

2 に答える 2

2

QTreeWidget からのシグナル itemClicked(QTreeWidgetItem * item, int column) を探していると思います。私は次のようなものを試してみます:

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

TreeWidget をサブクラス化し、 AddSubTree(QTreeWidgetItem* item, int column) をそのサブクラスのスロットにする必要があります。次に AddSubTree で、列番号が正しいことを確認し、正しい場合は適切なサブツリーを引数項目に追加します。

于 2013-09-26T11:03:55.120 に答える