如何在QTreeView中获取最后一个可见项目

时间:2013-10-31 17:05:00

标签: qt qtreeview

我在QTreeView中有一个QModelIndex项。

如何测试此项是QTreeView中的最后一个可见项?

Fox示例:

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

功能bool isItemVisible( QModelIndex idx );应为item2返回true,为sub21返回false

请注意,行的高度可能不同。

1 个答案:

答案 0 :(得分:1)

好吧,我为可能的函数制作了以下草图,它将告诉您项目是否是树视图层次结构中的最后一项:

功能本身:

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进行比较,而无需再次调用搜索功能。