当前位置:   article > 正文

【QML Model-View】ListView-增删改查(二)_qt qml listview用鼠标左键双击某个 item,该 item 就会从 listview

qt qml listview用鼠标左键双击某个 item,该 item 就会从 listview 中删除

使用 ListView 是为了向用户展示某些数据,期望用户根据这些数据做出一些反馈,比如买某个东西。而我们会经常需要访问、修改一个 ListView 展现的数据。现在我们就来看看怎么做。

1、访问数据

ListModel 的 count 属性表示 Model 中有多少条数据,int 类型。dynamicRoles 属性为布尔值,为 true 时表示 Model 中的 role 对应的值的类型可以动态改变,默认值是 false。要设置 dynamicRoles,必须在添加数据之前。不过要注意的是,一旦你使能了 dynamicRoles,ListModel 的性能会大大下降,通常它带来的性能损失是使用静态类型的 4〜6 倍。

ListModel 的get()方法接受一个 int 类型的参数,用来获取指定索引位置的数据,返回一 个 QML 对象。然后,我们就可以像访问属性那样访问数据的 role 了,正如我们在前面使用的那样:

  1. var data = listView.model.get(listView.currentIndex}
  2. listView.footerltem.text = data.name + " , " + data.cost + " , " + data.manufacturer

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

2、删除数据

如果你想删除一条或多条数据,可以使用 ListModel 的remove(int index, int count)方法,它有两个整型参数,第一个参数指明要删除的数据的索引位置,第二个参数表示要删除的数据条数,默认值为 1。

如果你想清空一个 Model,可以直接调用 clear() 方法。

现在我们将 phone_list_footer.qml 另存为 phone_list_change.qml,将 phoneDelegate 内的 MouseArea 对象修改为下面的样子:

  1. MouseArea {
  2. anchors.fill: parent
  3. onClicked: {
  4. wrapper.ListView.view.currentlndex = index
  5. }
  6. onDoubleClicked: {
  7. wrapper.ListView.view.model.remove(index)
  8. }
  9. }

然后执行 “qmlscene phone_list_change.qml” 命令,用鼠标左键双击某个 Item,该 Item 就会从 ListView 中删除。

让我们再修改一下 footer 组件,添加一个清除按钮,用来清除所有的数据。footer 组件的新代码如下:

  1. Component {
  2. id: footerView
  3. Item{
  4. id: footerRootItem
  5. width: parent.width
  6. height: 30
  7. property alias text: txt.text
  8. signal clean()
  9. Text {
  10. anchors.left: parent.left
  11. anchors.top: parent.top
  12. anchors.bottom: parent.bottom
  13. id: txt
  14. font.italic: true
  15. color: "blue"
  16. verticalAlignment: Text.AlignVCenter
  17. }
  18. Button {
  19. id: clearAll
  20. anchors.right: parent.right
  21. anchors.verticalCenter: parent.verticalCenter
  22. text: "Clear"
  23. onClicked: footerRootItem.clean()
  24. }
  25. }
  26. }

给 ListView 添加 Component.onCompleted 附加信号处理器:

  1. Component.onCompleted: {
  2. listView.footerItem.clean.connect(listView.model.clear)
  3. }

现在可以运行 phone_list_change.qml 了,看到界面右下角的 “Clear” 按钮了吧,点击它,列表所有数据就没啦。

3、修改数据

要想修改 Model 的数据,可以使用 ListModel 的setProperty(int index,string property, variant value)方法。该方法有三个参数,第一个是数据的索引,第二个是数据内 role 的名字,第三个是mle的值。比如要修改 “MI 2S" 的价格,可以这样:

listView.model.setProperty(5, "cost", 16999)

如果想替换某一条数据,可以使用set(int index, jsobject dict)方法。我们经常用对象的字面量表示法构造一个对象传递给 set() 方法。比如想把 “iPhone 3GS” 替换为 “Z5S mini”,可以这样:

listView.model.set(0, {"name" : "25S mini ", "cost" : 1999, "manufacturer"  : "ZhongXing"})

4、添加数据

要向 Model 的尾部添加数据,可以使用append()方法。append() 的参数是 jsobject,在 ECMAScript 中可以使用对象的字面量表示法来构造这个 jsobject,即花括号加 key-value 对的 集合,类似于这样:{"name" : "zhangsan", "age" : 28},key-value 对之间使用逗号分隔。这种方式与 QML 对象声明的方式略有不同。给个简单的例子:

  1. function addOne(){
  2. model.append(
  3. {
  4. "name": "MX3",
  5. "cost": "1799",
  6. "manufacturer": "MeiZu"
  7. }
  8. );
  9. }

如果想在指定位置添加数据,可以使用insert()方法,它的第一个参数是整型的,代表插 入的索引位置,第二个参数是 jsobject。

再来修改下phone_list_change.qml,新增添加数据的代码,全新的内容如下:

  1. import QtQuick 2.2
  2. import QtQuick.Controls 1.2
  3. import QtQuick.Layouts 1.1
  4. Rectangle {
  5. width: 360
  6. height: 300
  7. color: "#EEEEEE"
  8. Component {
  9. id: headerView
  10. Item {
  11. width: parent.width
  12. height: 30
  13. RowLayout {
  14. anchors.left: parent.left
  15. anchors.verticalCenter: parent.verticalCenter
  16. spacing: 8
  17. Text {
  18. text: "Name"
  19. font.bold: true
  20. font.pixelSize: 20
  21. Layout.preferredWidth: 120
  22. }
  23. // 省略。。。
  24. }
  25. }
  26. }
  27. Component {
  28. id: footerView
  29. Item{
  30. id: footerRootItem
  31. width: parent.width
  32. height: 30
  33. property alias text: txt.text
  34. // 1.自定义信号
  35. signal clean()
  36. signal add()
  37. Text {
  38. anchors.left: parent.left
  39. anchors.top: parent.top
  40. anchors.bottom: parent.bottom
  41. id: txt
  42. font.italic: true
  43. color: "blue"
  44. verticalAlignment: Text.AlignVCenter
  45. }
  46. Button {
  47. id: clearAll
  48. anchors.right: parent.right
  49. anchors.verticalCenter: parent.verticalCenter
  50. text: "Clear"
  51. onClicked: footerRootItem.clean()
  52. }
  53. Button {
  54. id: addOne
  55. anchors.right: clearAll.left
  56. anchors.rightMargin: 4
  57. anchors.verticalCenter: parent.verticalCenter
  58. text: "Add"
  59. onClicked: footerRootItem.add()
  60. }
  61. }
  62. }
  63. Component {
  64. id: phoneDelegate
  65. Item {
  66. id: wrapper
  67. width: parent.width
  68. height: 30
  69. MouseArea {
  70. anchors.fill: parent
  71. onClicked: {
  72. wrapper.ListView.view.currentIndex = index
  73. mouse.accepted = true
  74. }
  75. onDoubleClicked: {
  76. wrapper.ListView.view.model.remove(index)
  77. mouse.accepted = true
  78. }
  79. }
  80. RowLayout {
  81. anchors.left: parent.left
  82. anchors.verticalCenter: parent.verticalCenter
  83. spacing: 8
  84. Text {
  85. id: col1
  86. text: name
  87. color: wrapper.ListView.isCurrentItem ? "red" : "black"
  88. font.pixelSize: wrapper.ListView.isCurrentItem ? 22 : 18
  89. Layout.preferredWidth: 120
  90. }
  91. // 省略。。。
  92. }
  93. }
  94. }
  95. Component {
  96. id: phoneModel;
  97. ListModel {
  98. ListElement{
  99. name: "iPhone 3GS"
  100. cost: "1000"
  101. manufacturer: "Apple"
  102. }
  103. // 省略。。。
  104. }
  105. }
  106. ListView {
  107. id: listView
  108. anchors.fill: parent
  109. delegate: phoneDelegate
  110. model: phoneModel.createObject(listView)
  111. header: headerView
  112. footer: footerView
  113. focus: true
  114. highlight: Rectangle{
  115. color: "lightblue"
  116. }
  117. onCurrentIndexChanged: {
  118. if( listView.currentIndex >=0 ){
  119. var data = listView.model.get(listView.currentIndex)
  120. listView.footerItem.text = data.name + " , " + data.cost + " , " + data.manufacturer
  121. }else{
  122. listView.footerItem.text = ""
  123. }
  124. }
  125. // 2.槽函数:添加数据
  126. function addOne() {
  127. model.append(
  128. {
  129. "name": "MX3",
  130. "cost": "1799",
  131. "manufacturer": "MeiZu"
  132. }
  133. )
  134. }
  135. // 3.连接信号槽
  136. Component.onCompleted: {
  137. listView.footerItem.clean.connect(listView.model.clear)
  138. listView.footerItem.add.connect(listView.addOne)
  139. }
  140. }
  141. }

执行 “qmlscenephone_list_change.qml" 命令后的初始效果如下图所示。

点击 "Add" 按钮后的效果如下图所示。

到现在为止,这个例子涵盖了 ListView 的基本应用,包括怎样初始化一个 ListView、访问数据、删除数据、动态添加数据、处理高亮等内容。你可以点击 “Clear” 按钮、点击某个 Item 或者双击某个 Item 看看效果。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

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

闽ICP备14008679号