QML TreeView在单击以折叠或展开时通过先前的选择

问题描述:

我有一个包含一些onClicked()逻辑的QML TreeView,该逻辑调用Q_INVOKABLE函数,该函数接受TreeView的当前行号和父行号作为参数。问题是,当我选择一些东西,然后点击展开或折叠某些东西。以前的值仍然通过,有时会导致应用程序崩溃。我尝试致电treeView.selection.clearCurrentIndex()treeView.selection.clearSelection(),其中onCollapsed()onExpanded()取消选择该项目,但由于某种原因仍然传递先前选择的项目中的值。QML TreeView在单击以折叠或展开时通过先前的选择

//main.qml 

TreeView { 
    id: treeView 
    anchors.fill: parent 
    model: treeviewmodel 
    selection: ItemSelectionModel { 
     model: treeviewmodel 
    } 
    TableViewColumn { 
     role: "name_role" 
     title: "Section Name" 
    } 
    onCollapsed: { 
     treeView.selection.clearSelection() // deselects the item, but still passes the previous values 
    } 
    onExpanded: { 
     treeView.selection.clearSelection() 
    } 
    onClicked: { 
     console.log("Current Row: " + treeView.currentIndex.row + "Parent Row: " + treeView.currentIndex.parent.row) 
     //I need something here that will set treeView.currentIndex.row and treeView.currentIndex.parent.row to -1 
     //so that when I collapse or expand, -1 gets passed instead of the previous values 
    } 
} 
+0

也许你应该有一些属性来知道用户何时展开或折叠树以便在'onClicked'事件中传递-1。 – Tarod

+0

@塔罗德你的意思是什么?你能详细说明吗?谢谢! –

+1

如果在折叠或展开树后需要将-1传递给Q_INVOKABLE函数,请在折叠或展开树后使用标志并将其设置为true。之后,当调用'onClicked'事件时,如果它为true,则检查flag:pass-1到你的Q_INVOKABLE函数,或者使用提供的'treeView.currentIndex.row'和'treeView.currentIndex.parent.row' QML如果为false。需要时将标志值更改为false。也许我不明白这个问题,但这是我在阅读问题后想到的解决方案。 – Tarod

我能够通过设置一些额外的标志(谢谢@Tarod的帮助)解决此问题。我必须保存行的值,以便我可以检查它们是否发生了变化。如果他们没有改变,我不会调用这个函数,所以没有过时的值会被传递。

TreeView { 
    id: treeView 
    anchors.fill: parent 
    model: treeviewmodel 
    property int currentRow: -1 
    property int parentRow: -1 
    property int lastCurrentRow: -1 
    property int lastParentRow: -1 
    selection: ItemSelectionModel { 
     model: treeviewmodel 
    } 
    TableViewColumn { 
     role: "name_role" 
     title: "Section Name" 
    } 
    onCollapsed: { 
     currentRow = -1 
     parentRow = -1 
    } 
    onExpanded: { 
     currentRow = -1 
     parentRow = -1 
    } 
    onClicked: { 
     console.log("Row: " + treeView.currentIndex.row + " Parent : " + treeView.currentIndex.parent.row) 
     //logic needed to not reselect last item when collpasing or expanding tree 
     if (lastCurrentRow === treeView.currentIndex.row && lastParentRow === treeView.currentIndex.parent.row) 
     { 
      currentRow = -1 
      parentRow = -1 
     } 
     else 
     { 
      lastCurrentRow = treeView.currentIndex.row 
      lastParentRow = treeView.currentIndex.parent.row 
      currentRow = treeView.currentIndex.row 
      parentRow = treeView.currentIndex.parent.row 
     } 
     if (currentRow === -1 && parentRow === -1) 
     { 
      //nothing selected - do nothing 
     } 
     else 
     { 
      //omitted some additional logic 
     } 
    } 
}