QML TreeView проходит предыдущий выбор при нажатии, чтобы свернуть или развернуть

У меня есть QML TreeView содержащий некоторые onClicked() логика, которая вызывает функцию Q_INVOKABLE, которая принимает текущий номер строки и номер родительской строки TreeView в качестве параметров. Проблема в том, что когда я выбираю что-то, а затем нажимаю, чтобы развернуть или свернуть что-то. Предыдущие значения все еще передаются, что иногда приводит к сбою приложения. Я пытался позвонить treeView.selection.clearCurrentIndex() а также treeView.selection.clearSelection() в onCollapsed() а также onExpanded() который отменяет выбор элемента, но по какой-то причине все еще передает значения из ранее выбранного элемента.

//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
    }
}

1 ответ

Решение

Я смог решить эту проблему, установив некоторые дополнительные флаги (спасибо @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
        }
    }
}
Другие вопросы по тегам