提问人:kancler 提问时间:8/10/2023 最后编辑:Abderrahmene Rayene Mihoubkancler 更新时间:8/13/2023 访问量:61
如何从属性中为模型设置值?
How to set value to a model from the property?
问:
我想根据操作系统向模型添加不同的文件: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:不能将脚本用于属性值”
如何实现这一目标?
答:
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”
引用:
- https://doc.qt.io/qt-6/qqmlfileselector.html
- https://doc.qt.io/qt-6/qfileselector.html
- https://doc.qt.io/qt-6/qtquickcontrols-fileselectors.html
评论
0赞
GrecKo
8/12/2023
+1 关于文件选择器。请注意,这里只使用普通数组而不是 ListModel 也可以,不需要命令式 Component onCompleted。
评论