2015-11-12 29 views
3

为了扩展TreeView的节点以显示当前选择的项目(由共享选择模型设置),我需要递归调用TreeView.expand(QModelIndex)。在QML中遍历树,检查QModelIndex是否有效

expand(index) 
    expand(index.parent) 
    expand(index.parent.parent) 
    ... 

这可以通过一个函数来完成这样的:

function autoExpand(index) { 
    print(index) 
    var oneUp = index 

    do { 

     print(oneUp) 
     oneUp = index.parent 
     expand(oneUp) 
     print("do") 
     print(oneUp) 
    } while (oneUp) 

} 

但我不知道如何检查根节点。我试图

while (oneUp) -> always true 
while (oneUp.isValid) -> undefined ie always false 
while (oneUp.isValid()) -> property isValid cannot be called as a function 

,在C++中,它应该是:

do { 
    //.... 
} while (oneUp.isValid()); 

,但我无法找到QML同等功能(不知道到哪里寻找代码...)

作为一种变通方法我检查它在C++在已经出口,但是好了,它看起来并不合适的对象:

public slots: 
    bool indexIsValid(const QModelIndex &index) const {return index.isValid();} 
+0

这不起作用? http://doc.qt.io/qt-5/qml-qtquick-controls-treeview.html#expand-method – danielfranca

+0

它可以工作,但它也不会扩展父节点。这就是为什么我必须向上遍历树并扩展每个父节点 –

+0

您是否曾尝试追加根元素?然后再比较一下。 – danielfranca

回答

2

由于zizix的复制粘贴答案的副作用,我了解到,QModelIndex ::的isValid功能转换到QML中的index.valid属性(?)。使用我现在可以成功检测QML中树的根:

function autoExpand(index) { 
     var oneUp = index 

     do { 
      oneUp = oneUp.parent 
      expand(oneUp)     
     } while (oneUp.valid); 

    } 
1

“... \ Qt的\ 5.5 \ SRC \ qtquickcontrols的\ src \控件\ TreeView.qml”

function expand(index) { 
     if (index.valid && index.model !== model) 
      console.warn("TreeView.expand: model and index mismatch") 
     else 
      modelAdaptor.expand(index) 
    }