如何在 QML 中动态添加项目到 VisualItemModel?
How to add items dynamically to VisualItemModel in QML?
我有一个基于文本框的自定义 qml 元素。我希望每当用户按下 VisualItemModel 中的最后一个文本框时,都会自动添加一个新的文本框。有一种方法可以使用 ListModel(使用 append())执行此操作,但不能使用 VisualItemModel。
如何做到这一点?即使 Javascript 也会有所帮助。
似乎 VisualItemModel
并非真正用于动态管理 - 它是一个纯静态结构。
VisualItemModel
是一个懒惰且笨拙的解决方案,用于获取列表视图以显示不同的元素,将数据和 UI 塞在一起。如果那是重点,您可以通过使用标准 ListModel
和 ListView
:
轻松实现此目的
ListView {
anchors.fill: parent
model: mod
delegate: Loader {
source: name + ".qml"
}
}
然后你可以像这样附加到模型:
mod.append({"name" : "ItemName"})
然后在列表视图中,委托将为每个列表条目创建适当的元素。
如果您不希望项目有单独的来源,您可以将不同的项目包装在 Component
中,并在 Loader
中而不是 source
中设置 sourceComponent: name
:
Component {
id: c2
Rectangle {
width: 200
height: 100
color: "blue"
}
}
....
mod.append({"name" : c2})
但在您的情况下,您似乎不需要不同的元素来具有不同的 UI,因此您实际上也不需要 VisualItemModel
。只需让视图委托一个文本框并附加到标准 ListModel
,您将得到另一个文本框。
我有一个基于文本框的自定义 qml 元素。我希望每当用户按下 VisualItemModel 中的最后一个文本框时,都会自动添加一个新的文本框。有一种方法可以使用 ListModel(使用 append())执行此操作,但不能使用 VisualItemModel。
如何做到这一点?即使 Javascript 也会有所帮助。
似乎 VisualItemModel
并非真正用于动态管理 - 它是一个纯静态结构。
VisualItemModel
是一个懒惰且笨拙的解决方案,用于获取列表视图以显示不同的元素,将数据和 UI 塞在一起。如果那是重点,您可以通过使用标准 ListModel
和 ListView
:
ListView {
anchors.fill: parent
model: mod
delegate: Loader {
source: name + ".qml"
}
}
然后你可以像这样附加到模型:
mod.append({"name" : "ItemName"})
然后在列表视图中,委托将为每个列表条目创建适当的元素。
如果您不希望项目有单独的来源,您可以将不同的项目包装在 Component
中,并在 Loader
中而不是 source
中设置 sourceComponent: name
:
Component {
id: c2
Rectangle {
width: 200
height: 100
color: "blue"
}
}
....
mod.append({"name" : c2})
但在您的情况下,您似乎不需要不同的元素来具有不同的 UI,因此您实际上也不需要 VisualItemModel
。只需让视图委托一个文本框并附加到标准 ListModel
,您将得到另一个文本框。