Qt TreeView 问题记录

项目场景:记一次Qt TreeView 获取一个rootIndex()下的子节点的QModelIndex()时遇到的问题


问题描述:

在查找如下的树形结构根节点下的子节点的QModelIndex()时使用QTreeview的child(int arow, int acolumn)方法,然后想根据此节点的QModelIndex()使用isexpanded()方法来判断指定节点是否是展开的,这时候问题出现了,指定的节点是展开的,但使用isexpanded() 却判断为false.

(图片仅供参考)


原因分析:

首先查看QT官方文档对rootIndex的描述

注意The root can be invalid 这句话,上述有多个并列的兄弟节点的情况下,根节点并不是显式的,这里的根节点就是invalid的,虽然记录了与子节点的关系,但是是无效的,一开始我以为只要找到根节点就能找到指定的子节点。

然后再看一下child()方法的源码

inline QModelIndex QModelIndex::child(int arow, int acolumn) const
{ return m ? m->index(arow, acolumn, *this) : QModelIndex(); }

这里的m是const QAbstractItemModel *m;  如果是无效的根节点的话m就会被初始化为nullpter,所以这里返回的是QModelIndex(),问题就出现这里。


解决方案:

使用createIndex(),参数三可以通过自定义的TreeItem 来维护父子节点之间的关系

inline QModelIndex QAbstractItemModel::createIndex(int arow, int acolumn, void *adata) const
{ return QModelIndex(arow, acolumn, adata, this); }

猜你喜欢

转载自blog.csdn.net/qq_39304481/article/details/108404565
今日推荐