Javascript QML ListModel onDataChanged问题

Javascript QML ListModel onDataChanged问题,javascript,qt,callback,qml,qabstractlistmodel,Javascript,Qt,Callback,Qml,Qabstractlistmodel,我试图在QML ListModel上实现一个回调函数,以便在ListModel中的数据发生更改时执行一些操作。显然,不可能为ListModel中的单个用户定义属性创建经过更改的处理程序。因此,我尝试使用ListModel可用的onDataChanged处理程序 ListModel { id: model onDataChanged: { console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get

我试图在QML ListModel上实现一个回调函数,以便在ListModel中的数据发生更改时执行一些操作。显然,不可能为ListModel中的单个用户定义属性创建经过更改的处理程序。因此,我尝试使用ListModel可用的onDataChanged处理程序

ListModel {
    id: model

    onDataChanged: {
        console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get(bottomRight).val)
    }
}
然而,onDataChanged似乎只引用ListModel中的第一个元素。也就是说,左上角和右下角始终指向第一个元素,即使在我操作列表下方的元素时也是如此


这里我需要的是一个可靠的处理程序,当ListModel启动时,它能够准确地反映ListModel中的正确行。

当我更改ListModel中的数据时,一切似乎都是正确的。 试试这个例子:

Window {
    id: mainWindow
    visible: true
    width: 1200
    height: 800

    ListModel {
        id: lm
        ListElement { test: 0 }
        ListElement { test: 0 }
        ListElement { test: 0 }
        ListElement { test: 0 }
        ListElement { test: 0 }

        onDataChanged: console.log('Data Changed', topLeft.row, get(topLeft.row).test, data(topLeft, roles[0]))
    }

    ListView {
        width: 200
        height: 800
        model: lm
        delegate: Button {
            text: model.test
            onClicked: model.test++
        }
    }
}
QML-
get
-函数需要一个表示索引的整数,该整数对应于
QModelIndex.row
。标记在QML中您将行作为属性,因此
.row()
将失败


您也可以使用
数据(索引、角色)
-方法。这将使用
QModelIndex
作为索引,
角色
作为整数。这是幸运的,因为我知道没有非黑客的方法可以从信号提供的整数类型角色检索映射到QML中通常使用的
roleName
s。

如果使用a,则可以使用带有单个更改通知的常规属性。由于项目的限制,这是不可能的。当我操作不同的行时,为什么onDataChanged会返回第一行?我只是错误地使用了这些参数吗?
qabstractemmodel::dataChanged()
的参数是
QModelIndex
,即类类型的对象。如果将这些函数传递给需要整数的函数,JavaScript环境可能会执行其神奇的类型转换。对于更改的数据使用ListModel是很奇怪的,通常表明使用适当的自定义模型会更好。