Qt 扩展/连接多个ListModel的声明式方法
我想构建多个Qt 扩展/连接多个ListModel的声明式方法,qt,qml,Qt,Qml,我想构建多个ListModel,它们都从公共元素开始。 我想从另一个ListModel中填充其余元素 例如: 列表模型(1): 列表模型(2): 有没有一种方法可以声明性地“合并”或扩展两个ListModel 到目前为止,我正在动态地进行: import QtQuick 2.9 import QtQuick.Window 2.2 Window { width: 480 height: 320 visible: true ListModel {
ListModel
,它们都从公共元素开始。
我想从另一个ListModel
中填充其余元素
例如:
列表模型(1):
列表模型(2):
有没有一种方法可以声明性地“合并”或扩展两个ListModel
到目前为止,我正在动态地进行:
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
width: 480
height: 320
visible: true
ListModel {
id: commonModel
ListElement { value: "COMMON A" }
ListElement { value: "COMMON B" }
ListElement { value: "COMMON C" }
}
ListModel {
id: model1
ListElement { value: "A1" }
ListElement { value: "B1" }
ListElement { value: "C1" }
}
ListModel {
id: model2
ListElement { value: "A2" }
ListElement { value: "B2" }
ListElement { value: "C2" }
}
ListView {
anchors.fill: parent
model: commonModel // here I would like to directly specify the "concatenated" model
delegate: Text { text: model.value}
// dynamic part that I want to avoid
readonly property var additionalModel: model2
Component.onCompleted: {
for (var i = 0; i < additionalModel.count; ++i) {
var elt = additionalModel.get(i)
model.append(elt)
}
}
}
}
能够根据需要在其他组件中进行扩展:
ListView {
model: MyModel {
// keep original elements from MyModel and add custom "component-related" elements
ListElement { value: "OTHER A" }
ListElement { value: "OTHER B" }
ListElement { value: "OTHER C" }
}
}
但这似乎不可能,因为我得到了以下错误:
无法分配给不存在的默认属性
让我们从修补错误开始。它来自这里:
model: MyModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
要获得这种行为,您需要将MyModel
的一个属性设置为。琐碎地说,像
// MyModel.qml
ListModel {
default property list<ListElement> otherModels
ListElement { role_value: "COMMON A" }
ListElement { role_value: "COMMON B" }
ListElement { role_value: "COMMON C" }
}
// Main.qml
import QtQuick 2.0
import QtQuick.Window 2.2
Window {
ListView {
model: MyModel {
// these should be auto-assigned to the default property
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
}
}
下面是一个最小且完整的示例:
// MyModel.qml
import QtQuick 2.0
ListModel {
id: model
default property list<ListModel> otherModels
ListElement { role_value: "COMMON A" }
ListElement { role_value: "COMMON B" }
ListElement { role_value: "COMMON C" }
// called everytime a model is append to otherModels
onOtherModelsChanged: {
// add ListElements from the last otherModels to this model
var i = otherModels.length - 1;
if (i < 0) return;
for (var j = 0; j < otherModels[i].count; j++)
model.append(otherModels[i].get(j));
}
}
// Main.qml
import QtQuick 2.6
import QtQuick.Window 2.2 // Window
import QtQuick.Controls 2.2 // ItemDelegate
Window {
visible: true
width: 640
height: 480
ListView {
anchors.fill: parent
model: MyModel {
ListModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
}
delegate: ItemDelegate {
text: role_value
width: parent.width
}
}
}
这正是我想要实现的工作环境!非常好地使用了默认属性。谢谢:)请注意,我不必使用
列表
默认属性。同样的行为也可以只使用一个默认属性ListModel
,然后它还简化了下一个元素的添加:model.append(otherModels.get(j))
此外,我意识到这允许创建多个链式ListModel
组件,每个组件都将自己的ListElement
添加到模型中,允许在另一个子组件中继续扩展模型。很不错的!嗯。。。是的,你可以做默认属性列表模型
。这对于添加一个模型很有用。“我意识到这允许创建多个链式ListModel组件”哈哈,是的,我测试了它是否有效(同样在github演示中)。也许我的答案需要更多的解释
model: MyModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
// MyModel.qml
ListModel {
default property list<ListElement> otherModels
ListElement { role_value: "COMMON A" }
ListElement { role_value: "COMMON B" }
ListElement { role_value: "COMMON C" }
}
// Main.qml
import QtQuick 2.0
import QtQuick.Window 2.2
Window {
ListView {
model: MyModel {
// these should be auto-assigned to the default property
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
}
}
ListView {
model: MyModel {
// ListModel is auto-assigned to the default property
ListModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
}
}
// MyModel.qml
import QtQuick 2.0
ListModel {
id: model
default property list<ListModel> otherModels
ListElement { role_value: "COMMON A" }
ListElement { role_value: "COMMON B" }
ListElement { role_value: "COMMON C" }
// called everytime a model is append to otherModels
onOtherModelsChanged: {
// add ListElements from the last otherModels to this model
var i = otherModels.length - 1;
if (i < 0) return;
for (var j = 0; j < otherModels[i].count; j++)
model.append(otherModels[i].get(j));
}
}
// Main.qml
import QtQuick 2.6
import QtQuick.Window 2.2 // Window
import QtQuick.Controls 2.2 // ItemDelegate
Window {
visible: true
width: 640
height: 480
ListView {
anchors.fill: parent
model: MyModel {
ListModel {
ListElement { role_value: "OTHER A" }
ListElement { role_value: "OTHER B" }
ListElement { role_value: "OTHER C" }
}
}
delegate: ItemDelegate {
text: role_value
width: parent.width
}
}
}
onOtherModelChanged: {
if (otherModel === undefined) return;
for (var i = 0; i < otherModel.count; i++)
model.append(otherModel.get(i));
}