动态地使用委托模型和委托模型组QML?

问题描述

我一直使用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代码将完全不知道任何一个。它只会显示模型告诉它的内容。