2016-12-02 88 views
1

我有一個包含一些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

回答

0

我能夠通過設置一些額外的標誌(謝謝@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 
     } 
    } 
}