【问题标题】:Add statically object to ListModel将对象静态添加到 ListModel
【发布时间】:2013-12-12 07:25:28
【问题描述】:

我需要创建一个ListModel,它静态地包含一个对象(字符串和布尔值)。 如果我使用 append 添加到一个空的 ListModel 元素 - 一切正常。

property ListModel qwe: ListModel {}
var imageToAdd { value: "picture.png", imageType: 1 }

qwe.append({
    text: "TextToAdd",
    image: imageToADD,
    position: 1
})
// This works correct

但我需要静态创建ListModel,它不起作用。

ListModel {
    ListElement {
        text: "TextToAdd"
        image: { value: "Qwer.png", imageType: 1 }  // <-- This doesn't work
        position: 1
    }
}

它应该是什么样子?

【问题讨论】:

  • 您的原始代码中有var imageToADD { value: "picture.png" ... } 吗? image 是未使用的变量。
  • 没错,错过了名字。谢谢,已编辑

标签: qml qtquick2


【解决方案1】:

Qt 中的ListElement 必须具有stringboolnumbersenum 类型的值。不允许使用更复杂的数据类型,例如 hashmap。

您可以深入阅读 Qt 5.2 源代码:qqmllistmodel.cpp。自从Qt 4.7 times 以来,这并没有改变。

List 元素在 ListModel 定义中定义,并表示 将使用 ListView 或 Repeater 项目显示的列表。

列表元素的定义与其他 QML 元素一样,只是它们包含 role 定义而不是属性的集合。使用相同的 语法作为属性定义,角色都定义了数据的访问方式 并包含数据本身。

用于角色的名称必须以小写字母开头,并且应该是 对给定模型中的所有元素通用。值必须是简单的常量;任何一个 字符串(在调用 QT_TR_NOOP 时被引用并且可选地),布尔值 (真、假)、数字或枚举值(如 AlignText.AlignHCenter)。

然而,ListModel 似乎能够存储 ECMA-262 标准中定义的所有类型:原始类型,即 UndefinedNullBooleanNumber 和 @987654333 @ 以及 Object 类型。

编辑:如果要在 QML 中创建元素,则必须将代码重写为类似

ListModel {
    ListElement {
        text: "TextToAdd"
        imageValue: "Qwer.png"
        imageType: 1
        position: 1
    }
}

Edit2: 或者你使用 Javascript 方式。首先创建一个空模型并在开始时填充它

ListView {
    model: ListModel { id: qwe }
    delegate: ... 

    Component.onCompleted: {
        qwe.append({
            text: "Image 1",
            image: { value: "picture.png", imageType: 1 },
            position: 1
        });
        qwe.append({
            text: "Image 2",
            image: { value: "picture.png", imageType: 1 },
            position: 2
        });
        qwe.append({
            text: "Image 1",
            image: { value: "picture.png", imageType: 1 },
            position: 3
        });
    }
}

【讨论】:

  • 当然,检查我上面答案的编辑。
  • 感谢您的快速回答,但请查看我的第一篇文章。图像里面有 2 个字段的对象,它与您的示例不同。如果我附加到 ListModel 我的图像对象 - 我可以使用类似:“ListModelName.get(0).image.value” 我需要创建相同的列表模型,但不使用“附加” - 静态创建它
  • 好吧,如果你不能改变你的数据结构,你就必须用javascript。检查第二个编辑。这是仅有的两种不使用自定义组件的解决方案。
【解决方案2】:
model: ListModel {
    ListElement {
        name: "My Name"
        image: ListElement {
            src: "My src"
        }
    }
}

您可以在例如委托中访问它:

image.get(0).src

我认为您应该可以通过 image.src 访问它,但这不起作用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 2014-08-11
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多