【问题标题】:How do I find a particular ListElement inside a ListModel in qml?如何在 qml 的 ListModel 中找到特定的 ListElement?
【发布时间】:2017-02-01 23:01:03
【问题描述】:

Qt QML 有一个ListModel,可以用来表示列表数据。它提供了许多将元素添加到列表的方法,但我能找到的唯一检索元素的方法是需要索引的 get() 方法。

我想检查我的 ListModel 是否包含特定元素?有没有办法使用键和值接收 ListElement 对象?

例如考虑这个列表:

ListModel {
    id: fruitModel

    ListElement {
        name: "Apple"
        cost: 2.45
    }
    ListElement {
        name: "Orange"
        cost: 3.25
    }
    ListElement {
        name: "Banana"
        cost: 1.95
    }
}

是否有诸如fruitModel.get({name: "Banana"}) 之类的方法可以找到名称为“Banana”的元素并返回它们?

【问题讨论】:

  • 类似的东西:for(var i = 0; i < mylistModel.count; ++i) { if (mylistModel.get(i).name === name2search) { doSomething(mylistModel.get(i)); } }

标签: qt qml


【解决方案1】:

您将不得不迭代并检查列表元素。

如果您要执行不同的搜索,最好编写一个函数,您可以将搜索条件作为函子传递:

function find(model, criteria) {
  for(var i = 0; i < model.count; ++i) if (criteria(model.get(i))) return model.get(i)
  return null
}

您可以像这样使用它来查找名称为"Banana"的项目:

find(fruitModel, function(item) { return item.name === "Banana" })

如果可能有多个匹配项,则应返回项目数组而不是单个项目。

【讨论】:

  • 但是这个方法只返回一个元素,而不是全部。
  • @QtRoS - 阅读答案的最后一段。 OP 是关于一个特定的元素,而不是特定的元素。修改代码以返回命中数组很简单。
  • 我认为对于一个在原始问题中提出更简单解决方案的人来说这不是微不足道的。无论如何,返回项目数组是一个非常糟糕的主意 - 如果他将它们存储在某个地方怎么办? QML 运行时表示存储由 model.get() 返回的引用并不安全。所以在我看来,简单的循环将解决他的问题。在更高级的场景中,他可能会考虑使用模型项的副本。
  • 我不明白你挑剔的原因,如果你有更好的答案,那就去吧。很明显,如果你引用了一个对象,然后删除了这个对象,你会很糟糕。这并不意味着您永远不应该使用模型项目引用,它只是意味着不要对此感到愚蠢。最后,您可以轻松地修改解决方案,使其还包含一个仿函数,该函子可以处理每个命中的位置,而无需返回任何内容。最后,如果您打算对模型项进行更改,副本对您没有任何好处。
  • @dtech FWIW,我很欣赏 QtRoS 的挑剔。它可以帮助我更好地理解你的答案的界限,以及我可能在不知不觉中犯错误的方式。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多