2016-12-02 13 views
1

У меня есть QML TreeView, содержащий некоторую логику onClicked(), которая вызывает функцию 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

Возможно, у вас должны быть некоторые атрибуты, чтобы знать, когда пользователь расширил или скрестил дерево, чтобы передать -1 в событии 'onClicked'. – Tarod

+0

@Tarod Что значит атрибуты? Можете ли вы уточнить? Благодаря! –

+1

Если вам нужно передать -1 вашей функции Q_INVOKABLE после свернуть или развернуть дерево, используйте флаг и установите его значение true после свертывания или расширения дерева. После этого, когда вызывается событие onClicked, проверьте флаг: передайте -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 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^