如何从属性中为模型设置值?

How to set value to a model from the property?

提问人:kancler 提问时间:8/10/2023 最后编辑:Abderrahmene Rayene Mihoubkancler 更新时间:8/13/2023 访问量:61

问:

我想根据操作系统向模型添加不同的文件:ListView

ApplicationWindow {
    id: window
    readonly property string settingsFile: (Qt.platform.os === "android") ? "qrc:/huts/qml/settings-android.qml" : "qrc:/huts/qml/settings.qml"
    Drawer {
        ListView {
            id: listView
            model: ListModel {
            ListElement { title: qsTr("Port Settings"); source: window.settingsFile }
            ListElement { title: qsTr("Terminal"); source: "qrc:/huts/qml/terminal.qml" }
            }
        ...
        }
    ...

但是我收到一个错误:

“ListElement:不能将脚本用于属性值”

如何实现这一目标?

Android Qt ListView QML

评论


答:

1赞 JarMan 8/11/2023 #1

执行此操作的最简单方法是在 javascript 函数中附加项目。追加时可以使用脚本值。

ListModel
{
    id: listModel

    Component.onCompleted:
    {
        listModel.append({ 
            title: qsTr("Port Settings"),
            source: window.settingsFile
        });
        listModel.append({ 
            title: qsTr("Terminal"),
            source: "qrc:/huts/qml/terminal.qml"
        });
    }
}
1赞 Stephen Quan 8/11/2023 #2

对于问题的 Android 部分,您应该借此机会使用文件选择器:+android

huts/qml/terminal.qml
huts/qml/+android/terminal.qml

即当您在QML中使用时,QML将自动在Android上加载Android专用文件,并默认加载另一个文件。"huts/qml/terminal.qml"

至于你的ListModel,QML不允许你使用表达式初始化它,所以不允许以声明方式访问变量或使用qsTr()。正如另一个答案所建议的那样,您可以在代码中执行此操作。你可以通过声明一个 JavaScript 对象并从该对象初始化你的 ListModel,在声明式和命令式之间取得更高的平衡,例如

    ListView {
        id: listView
        model: ListModel {
            property var _data: [
                { title: qsTr("Port Settings"), source: "huts/qml/settings.qml" },
                { title: qsTr("Terminal"), source: "huts/qml/terminal.qml" }
            ]
            Component.onCompleted: { for (let obj of _data) append(obj) }
        }
        delegate: ItemDelegate { text: title }
    }

注意,在QML中使用“qrc:/”可能不是必需的,因为您的主应用程序可能已经是“qrc:”资源,因此,使用对主文件所在位置的相对引用就足够了。所以“huts/qml/settings.qml”而不是“qrc:/huts/qml/settings.qml”

引用:

评论

0赞 GrecKo 8/12/2023
+1 关于文件选择器。请注意,这里只使用普通数组而不是 ListModel 也可以,不需要命令式 Component onCompleted。