问题描述
我一直使用DelegateModel和DelegateModelGroup在我的委托中仅显示列表模型的某些项目。该过程与对this question的第一个答案中描述的过程基本相同。下面是DelegateModel的代码。
DelegateModel {
id: displayDelegateModel
delegate: mMissionDelegate
model: mMissionModel
groups: [
DelegateModelGroup {
includeByDefault: false
name: "todaysMissions"
}
]
filterOnGroup: "todaysMissions"
Component.onCompleted: {
updateMissions()
}
}
我正在使用它,以便一次在委托中仅显示ListModel中的3个随机元素。然后,一旦c ++的定时器超时并发出信号,便使用一个函数更新这些函数,以便使用新的3个元素。这是更新功能的代码,并且与c ++有关联。
Connections{
target: FlashingTimer
function onCallUpdateMissions(){
updateMissions();
}
}
function updateMissions(){
var rowCount = mMissionModel.count;
mArray = [];
displayDelegateModel.items.remove(0,displayDelegateModel.items.count);
for(let i =0;i < rowCount;i++ ) {
let entry = mMissionModel.get(i);
mArray.push(entry)
}
let arr = mArray.sort(() => Math.random() - Math.random()).slice(0,3)
displayDelegateModel.items.insert(arr[0],"todaysMissions");
displayDelegateModel.items.insert(arr[1],"todaysMissions");
displayDelegateModel.items.insert(arr[2],"todaysMissions");
}
在开始时,它也会自动使用Component.onCompleted调用该函数。 我的问题是,在切换出群组之前,我无法弄清楚如何从群组中删除所有内容。我以为item.remove行会做到这一点,但是即使items.count变为零,这些项目仍会出现在委托中,而items.insert只会添加到底部(因此可以看到6个委托)。>
如果我使用简单的语法,或者应该使用完全不同的方法,有人知道我可以做到这一点的方法吗?
解决方法
我对DelegateModels不太熟悉,即使在您共享的SO链接中,也提到了DelegateModels并不是最短的路径。我建议改用QSortFilterProxyModel。源模型包含所有列表元素,然后代理模型将过滤掉除随机3个项目之外的所有内容。
这样做的好处是,计时器代码和随机化都将在C ++模型中隔离。 QML代码将完全不知道任何一个。它只会显示模型告诉它的内容。