1

QTreeView に項目の QModelIndex があります。

このアイテムがQTreeViewで最後に表示されるアイテムであることをテストする方法は?

キツネの例:

-item1 // expanded
--sub11
--sub12
-item2 // collapsed
--sub21

関数は、item2 と sub21 に対してbool isItemVisible( QModelIndex idx );返される必要があります。truefalse

行の高さが異なる場合があることに注意してください。

4

1 に答える 1

3

さて、アイテムがツリー ビュー階層の最後のアイテムであるかどうかを示す可能な関数について、次のスケッチを作成しました。

関数自体:

bool isItemVisible(QTreeView *view, const QModelIndex &testItem,
                   const QModelIndex &index)
{
    QAbstractItemModel *model = view->model();
    int rowCount = model->rowCount(index);
    if (rowCount > 0) {
        // Find the last item in this level of hierarchy.
        QModelIndex lastIndex = model->index(rowCount - 1, 0, index);
        if (model->hasChildren(lastIndex) && view->isExpanded(lastIndex)) {
            // There is even deeper hierarchy. Drill down with recursion.
            return isItemVisible(view, testItem, lastIndex);
        } else  {
            // Test the last item in the tree.
            return (lastIndex == testItem);
        }    
    } else {
        return false;
    }    
}

使い方:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTreeView view;
    MyModel model; // The QAbstractItemModel.
    view->setModel(&model);

    QModelIndex indexToTest = model.index(3, 0); // Top level item (4-th row).
    // Start testing from the top level nodes.
    bool result = isItemVisible(&view, indexToTest, QModelIndex());

    return a.exec();
}

この機能を集中的にテストしていないことに注意してください。ただし、問題なく動作すると思います。もちろん、それを改善することもできます。

アップデート:

提案された方法について説明した後、関数呼び出しの数を減らし、全体的なパフォーマンスを向上させる次のソリューションを提案します。

// Returns the last visible item in the tree view or invalid model index if not found any.
QModelIndex lastVisibleItem(QTreeView *view, const QModelIndex &index = QModelIndex())
{
    QAbstractItemModel *model = view->model();
    int rowCount = model->rowCount(index);
    if (rowCount > 0) {
        // Find the last item in this level of hierarchy.
        QModelIndex lastIndex = model->index(rowCount - 1, 0, index);
        if (model->hasChildren(lastIndex) && view->isExpanded(lastIndex)) {
            // There is even deeper hierarchy. Drill down with recursion.
            return lastVisibleItem(view, lastIndex);
        } else  {
            // Test the last item in the tree.
            return lastIndex;
        }    
    } else {
        return QModelIndex();
    }
}

ツリーで最後に表示された項目を追跡する変数を定義します。例えば:

static QModelIndex LastItem;

ツリー ビュー アイテムが展開または追加/削除されるたびに、キャッシュされたアイテムを更新します。これは、 QTreeView のexpanded(), collapsed(),信号に接続されたスロットで実現できます。:rowsAboutToBeInsertedrowsAboutToBeRemoved()

..
{
    LastItem = lastVisibleItem(tree);
}

最後に、ツリー ビュー アイテムをテストするには、LastItem検索関数を再度呼び出さずに、そのモデル インデックスをこれと比較するだけです。

于 2013-10-31T19:30:53.167 に答える