如何配置DelegateModel的update函数实现visibility角色过滤?
问题:DelegateModel新增visibility过滤组不生效的解决方法
现有一个用于过滤ListModel的DelegateModel代码,已使用visible、folder、falsie三个组且功能正常,现在需要新增visibility组,仅显示visibility角色为false的模型项,但配置后未得到预期结果。
现有组功能说明:
visible组:过滤role值为false的项folder组:过滤roleTwo(folder角色)不为空字符串的项falsie组:实现每页35条的分页显示
原代码:
import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQml.Models 2.4 DelegateModel { property string roleThree property string roleTwo property string role property int from: 0 property int to: 10 onRoleChanged: Qt.callLater(update) onFromChanged: Qt.callLater(update) onToChanged: Qt.callLater(update) groups: [ DelegateModelGroup { id: newItems name: "new" includeByDefault: true onCountChanged:{ Qt.callLater(update) } }, DelegateModelGroup { id: visibleItems name: "visible" includeByDefault: false }, DelegateModelGroup { id: folderItems name: "folder" includeByDefault: false }, DelegateModelGroup { id: visibilityItems name: "visibility" includeByDefault: false }, DelegateModelGroup { id: falsieItems name: "falsie" includeByDefault: false } ] filterOnGroup: "falsie" function update() { newItems.setGroups(0, newItems.count, [ "new" ] ); for (let i = 0; i < newItems.count; i++) { let item = newItems.get(i).model; let visible = item[role] === false ; let folder = item[roleTwo] !== ""; let visibility = item[roleThree] ===false; if (!visible && !folder && visibility) continue; newItems.setGroups(i, 1, [ "new", "visible" ]); visibleItems.setGroups(i, 1, [ "visible","folder"]); } visibleItems.setGroups(from, to - from , ["visible","falsie"]); } Component.onCompleted: Qt.callLater(update) }
解决方案
问题出在update函数的逻辑判断和组添加流程上,调整过滤条件并正确将符合要求的项加入visibility组,再联动到最终的falsie组即可解决。修改后的update函数如下:
function update() { // 重置所有项到初始new组 newItems.setGroups(0, newItems.count, [ "new" ] ); for (let i = 0; i < newItems.count; i++) { let item = newItems.get(i).model; // 明确各过滤条件判断 let matchVisible = item[role] === false; let matchFolder = item[roleTwo] !== ""; let matchVisibility = item[roleThree] === false; // 过滤规则:必须满足visibility条件,同时满足visible或folder的任意一个条件 if (!matchVisibility || (!matchVisible && !matchFolder)) { continue; } // 动态添加符合条件的组 let targetGroups = ["new"]; if (matchVisible) targetGroups.push("visible"); if (matchFolder) targetGroups.push("folder"); targetGroups.push("visibility"); newItems.setGroups(i, 1, targetGroups); } // 从visibility组中选取分页范围的项,加入falsie组(最终显示组) visibilityItems.setGroups(from, to - from, ["visibility", "falsie"]); }
修改说明:
- 修正过滤逻辑:把原代码混乱的条件判断改为明确规则,确保只有同时满足
visibility角色为false,且符合visible或folder组条件的项才会被处理。 - 正确分配组:根据项的匹配结果动态添加对应组,确保
visibility组被正确赋予给符合要求的项。 - 调整分页来源:因为最终
filterOnGroup指向falsie,所以分页时从visibility组中选取范围项加入falsie,保证只有满足visibility条件的项进入分页显示。
内容的提问来源于stack exchange,提问作者cgiannakidis
相关产品推荐
相关产品推荐

