当前位置:   article > 正文

QML 模型(ListModel)_qml listmodel

qml listmodel

LIstModel(列表模型)

ListModel 是ListElement定义的简单容器,每个定义都包含数据角色。内容可以在 QML 中动态定义或显式定义。

属性:

count模型中数据条目的数量
dynamic动态角色,默认情况下,角色的类型在首次使用角色时是固定的

方法:

append()添加新项到模型末尾
clear()从模型中删除所有内容
get(int index)返回列表模型中索引处的项。这允许从 JavaScript 访问或修改项目数据:
insert()将新项添加到位于位置索引的列表模型中,并将值置于字典
move()将 n 个项目从一个位置移动到另一个位置
remove()从模型中删除索引处的内容
set()更改列表模型中索引处的
setProperty()修改指定位置的属性
sync()从工作线程脚本修改列表模型后,将任何未保存的更改写入列表模型。

在列表容器中添加列表项:

ListElement添加的规则:

  1. 必须以小写字母开头,并且对于给定模型中的所有元素都应通用
  2. 值必须是简单的常量;字符串
  3. 布尔值(真、假)、数字或枚举值
  1. ListModel{
  2. id:model1
  3. ListElement{ //使用ListElement添加列表数据项
  4. name:"1111"
  5. age:"12"
  6. }
  7. ListElement{
  8. name:"2222"
  9. age:"13"
  10. }
  11. }

使用ListView显示:

使用ListView获取ListModel通过delegate(委托)来选择格式来显示数据

  1. ListModel{
  2. id:model1
  3. ListElement{
  4. name:"1111"
  5. age:"12"
  6. }
  7. ListElement{
  8. name:"2222"
  9. age:"13"
  10. }
  11. }
  12. ListView{
  13. anchors.fill: parent
  14. model: model1
  15. delegate: Row{
  16. Text{text:"名字:"+name}
  17. Text{text:"年龄:"+age}
  18. }
  19. }

 使用Component(组键)包装,用来显示信息:

  1. Window {
  2. id:window1
  3. visible: true
  4. width: 700
  5. height: 700
  6. title: qsTr("Hello World")
  7. ListModel{
  8. id:model1
  9. ListElement{
  10. name:"1111"
  11. age:"12"
  12. }
  13. ListElement{
  14. name:"2222"
  15. age:"13"
  16. }
  17. }
  18. Component{
  19. id:component1
  20. Row{
  21. spacing: 10
  22. Text{text:"名字:"+name}
  23. Text{text:"年龄:"+age}
  24. }
  25. }
  26. ListView{
  27. anchors.fill: parent
  28. model: model1
  29. delegate: component1 //设置委托
  30. }
  31. }

在ListElement中嵌套ListElement的处理:

  1. ListModel {
  2. id: fruitModel
  3. ListElement {
  4. name: "小明"
  5. age: 13
  6. attributes: [
  7. ListElement { description: "学生" },
  8. ListElement { description: "学习委员" }
  9. ]
  10. }
  11. ListElement {
  12. name: "王老师"
  13. age: 30
  14. attributes: [
  15. ListElement { description: "班主任" }
  16. ]
  17. }
  18. ListElement {
  19. name: "张三"
  20. age: 13
  21. attributes: [
  22. ListElement { description: "学生" },
  23. ListElement { description: "体育委员" }
  24. ]
  25. }
  26. }
  27. Component {
  28. id: fruitDelegate
  29. Item {
  30. width: 200; height: 50
  31. Text { id: nameField; text: name }
  32. Text { text: ':' + age; anchors.left: nameField.right }
  33. Row {
  34. anchors.top: nameField.bottom
  35. spacing: 5
  36. Text { text: "身份" }
  37. Repeater {
  38. model: attributes
  39. Text { text: description }
  40. }
  41. }
  42. }
  43. }
  44. ListView{
  45. anchors.fill: parent
  46. model:fruitModel
  47. delegate: fruitDelegate
  48. }

 

 函数的使用:

  1. ListModel{
  2. id:model1
  3. ListElement{
  4. name:"1111"
  5. age:"12"
  6. }
  7. ListElement{
  8. name:"2222"
  9. age:"13"
  10. }
  11. }
  12. //输出列表项的个数
  13. Component.onCompleted: {
  14. console.log("列表项的个数",Model.count)
  15. }
  16. //添加数据到尾部
  17. Component.onCompleted: {
  18. model1.append({"name":3333,"age":13})
  19. }
  20. //插入数据
  21. Component.onCompleted: {
  22. model1.insert(1,{"name":4444,"age":13})
  23. }
  24. //获取数据
  25. Component.onCompleted: {
  26. var data=model1.get(1).name;
  27. model1.get(1).name="5555"
  28. model1.get(1).age="15"
  29. }
  30. //移动数据
  31. Component.oncompleted:{
  32. model1.move(0,model1.count-3,3);//3 项移动到列表末尾
  33. }
  34. //删除数据
  35. Component.oncompleted:{
  36. model1.remove(2);//删除索引处的内容
  37. }
  38. //清空
  39. Component.oncompleted:{
  40. model1.clear();//清空
  41. }
  42. //修改索引处的值
  43. Component.oncompleted:{
  44. model1.set(1,{"name":3222,"age":13})
  45. }
  46. //设置索引处的属性
  47. Component.oncompleted:{
  48. model1.setProperty(1,"name","12222")
  49. }

 列表模型和WorkerScript的使用

listModel可以和WorkerScript一起使用,可以从多线程访问列表,可以将列表操作移动到其他线程以避免阻塞主 GUI 线程。

定时添加数据:

  1. Timer { //定时器
  2. id: timer
  3. interval: 2000; repeat: true
  4. running: true
  5. triggeredOnStart: true
  6. onTriggered: { //定时器触发
  7. var msg = {'action': 'appendCurrentTime', 'model': listModel};
  8. worker.sendMessage(msg);
  9. }
  10. }
  11. WorkerScript.onMessage = function(msg) {
  12. if (msg.action == 'appendCurrentTime') {
  13. var data = {'time': new Date().toTimeString()};
  14. msg.model.append(data); //添加数据
  15. msg.model.sync(); // 更新列表
  16. }
  17. }

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

闽ICP备14008679号