当前位置:   article > 正文

Roson的Qt之旅#102 QML ListModel_qml listmodel setproperty

qml listmodel setproperty

1.ListModel概述

ListModel是一个简单的容器,可以包含 ListElement类型存储数据。

ListModel的数据项数目可以使用count 属性获得。为了维护模型中的数据,该类型还提供了一系列函数,包括追加append(),插人 insert()、移动move()、移除remove()和替换set()等。这些函数都接受字典类型作为其参数,这种字典类型会被模型自动转换成 ListElement对象。如果需要通过模型修改ListElement中的内容,可以使用setProperty()函数,这个函数可以修改给定索引位置的 ListElement的属性值。

ListElement需要在ListModel中定义,表示能够在 ListView或Repeater 中使用的数据项

ListElement 的使用同其他QML类型基本没有区别,不同之处在于,ListElement没有固定的属性,而是一系列自定义的键值。可以把 ListElement看作是一个键值对组成的集合,其中键被称为role(角色)。它使用与属性相同的语法进行定义。角色既定义了如何访问数据,也定义了数据本身。角色的名字以小写字母开始,并且应当是给定模型中所有 ListElement通用的名字。角色的值必须是简单的常量:字符串(带有引号,可以包含在QT_ TR_NOOP调用中)、布尔类型(true和 false)、数字或枚举类似(例如AlignText. AlignHCenter)。角色的名字供委托获取数据使用。每一个角色的名字都可以在委托的作用域内访问,并且指向当前ListElement 中对应的值。另外,角色还可以包含列表数据,例如包含多个ListElement.


2.代码示例

  1. import QtQuick 2.9
  2. import QtQuick.Window 2.2
  3. import QtQml.Models 2.2
  4. Window {
  5. visible: true
  6. width: 640
  7. height: 480
  8. title: qsTr("Hello World")
  9. ListModel {
  10. id: fruitModel
  11. ListElement {
  12. name: "Apple"
  13. cost: 2.45
  14. attributes: [
  15. ListElement {
  16. description: "core"
  17. },
  18. ListElement {
  19. description: "Deciduous"
  20. }
  21. ]
  22. }
  23. ListElement {
  24. name: "Orange"
  25. cost: 3.25
  26. attributes: [
  27. ListElement {
  28. description: "Citrus"
  29. }
  30. ]
  31. }
  32. ListElement {
  33. name: "Banana"
  34. cost: 1.95
  35. attributes: [
  36. ListElement {
  37. description: "Tropical"
  38. },
  39. ListElement {
  40. description: "Seedless"
  41. }
  42. ]
  43. }
  44. }
  45. Component {
  46. id: fruitDelegate
  47. Item {
  48. width: 200
  49. height: 50
  50. Text {
  51. id: nameField
  52. text: name
  53. }
  54. Text {
  55. text: '$' + cost
  56. anchors.left: nameField.right
  57. }
  58. Row {
  59. anchors.top: nameField.bottom
  60. spacing: 5
  61. Text {
  62. text: "Attributes:"
  63. }
  64. Repeater {
  65. model: attributes
  66. Text {
  67. text: description
  68. }
  69. }
  70. }
  71. MouseArea {
  72. anchors.fill: parent
  73. onClicked: fruitModel.setProperty(index, "cost", cost * 2)
  74. }
  75. }
  76. }
  77. ListView {
  78. anchors.fill: parent
  79. model: fruitModel
  80. delegate: fruitDelegate
  81. }
  82. }

运行结果: 

3.代码释义

上面的代码使用了一个 ListModel模型对象,用于存储一个水果信息的列表。ListModel包含了3个数据条目,分别由一个 ListElement类型表示。每个 ListElement都有3个角色;name, cost和 attributes,分别表示了水果的名字、售价和特色描述,其中attributes角色使用了列表数据。这里使用了ListView展示这个模型(也可以使用Repeater,方法是类似的)。ListView需要指定两个属性:model和 delegate。model属性指定定义的fruitModel模型;delegate指定自定义委托。这里使用Component内联组件作为委托,其中使用Text、Row等 Qt Quick项目定义每个数据条目的显示方式。在其中可以直接使用 ListElement中定义的角色。对于attributes 角色,这里使用了Repeater进行显示。委托还使用了MouseArea,在其中调用了setProperty()函数。当在一个数据条目上单击鼠标时,其售价都会翻倍。这里使用了index获取模型中被鼠标单击的数据项索引。


注意:动态创建的内容一旦设置完成就不能再被修改。setProperty函数只能修改那些直接在模型中显式定义的元素的数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/170719
推荐阅读
相关标签
  

闽ICP备14008679号