1

在下面的代码中,属性__operatingModus_season每 30 秒更新一次。但在前端,我看不到任何价值或变化。如果我错了,请多多指教。

ListModel{
    id: tileListModelBetriebsmodus
    Component.onCompleted: {
        if(__is_automatik_mode_ON){
            tileListModelBetriebsmodus.append({"tileListSource": "../../images/HausScreen/operatingModeAuto.png",
                                                  "tileListText": getFrontendText("AUTO"),
                                                  "tileListValue": __operatingModus_season
                                              })
        }else{
            tileListModelBetriebsmodus.append({"tileListSource": "../../images/HausScreen/hamburgerfinger.png",
                                                  "tileListText": getFrontendText("MANUAL"),
                                                  "tileListValue": __operatingModus_season
                                              })
        }
    }
}
4

3 回答 3

0

这种将项目添加到 ListModel 的方式不会使它们成为动态的,值是在现场存储的。

您也许可以像这样创建属性绑定

ListModel{
    id: tileListModelBetriebsmodus
    Component.onCompleted: {
            if(__is_automatik_mode_ON){
                tileListModelBetriebsmodus.append({"tileListSource": "../../images/HausScreen/operatingModeAuto.png",
                                                      "tileListText": getFrontendText("AUTO"),
                                                      "tileListValue": Qt.binding(function() { return __operatingModus_season })
                                                  })
            }else{
                tileListModelBetriebsmodus.append({"tileListSource": "../../images/HausScreen/hamburgerfinger.png",
                                                      "tileListText": getFrontendText("MANUAL"),
                                                      "tileListValue": Qt.binding(function() { return __operatingModus_season }
                                                  })
            }
        }
    }

请注意,我没有对此进行测试,如果您要添加一个最小的工作示例,我可以这样做。

于 2020-01-30T13:25:40.020 回答
0

Amfasis 的回答建议使用Qt.binding()是在正确的轨道上,除了 Qt 不允许将绑定对象直接分配给 ListElement。但是,它允许分配普通的 JS 函数对象。因此,您必须分两步完成:

第 1 步:将动态评估的 ListElement 角色定义为 JS 函数(提示:您也可以使用箭头语法来使其更具可读性),例如:

ListElement {
   dynamicLabel: () => config.useLabelA ? labelA : labelB
}

第 2 步:在委托中设置目标项和模型角色之间的绑定:

ListView {
    delegate: Text {
        Component.onCompleted: {
            text: Qt.binding(model.dynamicLabel)
        }
    }
}

请注意需要通过Component.onCompleted,因为您不能text: Qt.binding(model.dynamicLabel)直接执行(QML 吐出错误“在绑定声明中无效使用 Qt.binding()。”)。

您不能只是这样做text: model.dynamicLabel,因为这只会在初始分配时评估 JS 函数一次,但如果例如config.useLabelA更改则不会更新。这就是您需要Qt.binding()包装器的目的。

于 2021-01-26T22:18:39.437 回答
0

基于 Romain Pokrzywka 的回答:

text: valuedUpdated() ? model.dynamicLabel : ""每当更新值时都会评估。valuedUpdated() 是一个 Q_PROPERTY,它返回 true。每当值更新时,都可以发出通知信号。

于 2022-01-17T17:14:26.460 回答