【问题标题】:QML ListModel onDataChanged issuesQML ListModel onDataChanged 问题
【发布时间】:2017-01-31 19:06:11
【问题描述】:

我正在尝试在我的 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 触发时准确地反映正确的行。

【问题讨论】:

  • 如果您使用generic object model,则可以使用常规属性和单独的更改通知。
  • 由于项目的限制,不可能。当我操作不同的行时,为什么 onDataChanged 会返回第一行?我只是错误地使用了这些参数吗?
  • QAbstractItemModel::dataChanged() 的参数是QModelIndex,即类类型的对象。您将这些传递给期望整数的函数,JavaScript 环境可能会执行其魔术类型转换之一。对变化的数据使用 ListModel 很奇怪,通常表明使用适当的自定义模型会更好。

标签: javascript qt callback qml qabstractlistmodel


【解决方案1】:

当我更改 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)-方法。这需要QModelIndex 作为索引,role 作为整数。这是幸运的,因为我不知道没有非 hacky 方法可以从信号提供的整数类型角色检索映射到 QML 通常使用的 roleNames。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多