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

能否通过JavaScript逻辑在QML中为Repeater选择不同代理?

QML Repeater 动态选择代理实现方案

可以实现根据JavaScript逻辑切换Repeater的代理,但你写的语法不符合QML规范——三元表达式返回的是组件类型,无法直接在其后附加属性块。下面提供两种可行的实现方式:

方式一:用Loader加载预定义Component

将两个外部代理封装为Component,通过Loader的sourceComponent动态切换,代理内部可直接访问Repeater上下文的属性(如model数据、gridview参数):

Repeater {
    model: elementModel

    delegate: Loader {
        // 根据JS逻辑选择要加载的组件
        sourceComponent: pickDelegate() ? periodicDelegate : otherDelegate

        // 封装外部代理为Component
        Component {
            id: periodicDelegate
            PeriodicTableDelegate {
                height: gridview.cellHeight
                selectionModel: itemSelectionModel
                width: gridview.cellWidth
                x: (group - 1) * width
                y: (period - 1) * height
            }
        }

        Component {
            id: otherDelegate
            SomeOtherDelegate {
                height: gridview.cellHeight
                selectionModel: itemSelectionModel
                width: gridview.cellWidth
                x: (group - 1) * width
                y: (period - 1) * height
            }
        }
    }
}

function pickDelegate(){
    return window.height > 60
}

方式二:用Loader直接加载外部QML文件

如果不想封装Component,可直接通过Loader的source属性指定外部文件路径,再通过onLoaded回调设置代理属性:

Repeater {
    model: elementModel

    delegate: Loader {
        source: pickDelegate() ? "PeriodicTableDelegate.qml" : "SomeOtherDelegate.qml"

        // 加载完成后设置代理属性
        onLoaded: {
            item.height = gridview.cellHeight
            item.selectionModel = itemSelectionModel
            item.width = gridview.cellWidth
            item.x = (group - 1) * item.width
            item.y = (period - 1) * item.height
        }
    }
}

function pickDelegate(){
    return window.height > 60
}

注意事项

  • 确保外部代理文件(PeriodicTableDelegate.qml、SomeOtherDelegate.qml)中定义了对应的可绑定属性(如height、selectionModel等);
  • 如果判断条件会动态变化(比如窗口大小改变),可将pickDelegate()改为属性绑定,比如sourceComponent: window.height > 60 ? periodicDelegate : otherDelegate,这样代理会自动重新加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:23:29