能否通过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
相关产品推荐
相关产品推荐

