You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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"]);
}

修改说明:

  1. 修正过滤逻辑:把原代码混乱的条件判断改为明确规则,确保只有同时满足visibility角色为false,且符合visible或folder组条件的项才会被处理。
  2. 正确分配组:根据项的匹配结果动态添加对应组,确保visibility组被正确赋予给符合要求的项。
  3. 调整分页来源:因为最终filterOnGroup指向falsie,所以分页时从visibility组中选取范围项加入falsie,保证只有满足visibility条件的项进入分页显示。

内容的提问来源于stack exchange,提问作者cgiannakidis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:55:18