0

我正在尝试在我的 QML ListModel 上实现一个回调函数,以便在 ListModel 中的数据发生变化时执行一些操作。显然,不可能为 ListModel 中的各个用户定义属性创建 on...Changed 处理程序。所以,我正在尝试使用 ListModel 可用的 onDataChanged 处理程序。

ListModel {
    id: model

    onDataChanged: {
        console.warn("onDataChanged: "+get(topLeft).val + " vs. " + get(bottomRight).val)
    }
}

但是,onDataChanged 似乎只引用了 ListModel 中的第一个元素。也就是说,topLeft 和 bottomRight 始终指向第一个元素,即使我在列表中向下操作一个元素也是如此。

我在这里需要的是一个可靠的处理程序,它可以在 ListModel 触发时准确地反映正确的行。

4

1 回答 1

0

当我更改数据时,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()将失败。

您可以选择使用data(index, role)- 方法。这需要一个QModelIndexas 索引和roleas 整数。这是幸运的,因为我知道没有非 hacky方法可以将信号提供的整数类型角色的映射检索到roleNameQML 中通常使用的 s 中。

于 2017-02-01T10:13:39.790 回答