编写类似代码时:
Item{
id: item
enabled: backend.property == "X"
}
何时对谓词进行评估。一旦?还是每次属性更改?
此外,当在状态更改中分配属性时,它如何应用:在状态更改时或在每次发出属性更改信号时对它进行一次评估?
State {
name: "One"
when: step == 2
PropertyChanges {
target: item
enabled: backend.property == "X"
}
每当谓词中发生的任何属性发生更改(通过Q_PROPERTY(... NOTIFY signalX)
进行评估时,都会对赋值进行评估。在您的示例中,它可以是backend
或property
。
您的示例中的PropertyChanges
将执行相同的操作,每当任何属性更改时,都会对其进行评估。如果将true
分配给explicit
属性,则状态更改时,它将是一次评估。
您可以通过在属性设置器中放置break或print语句来看到自己。每次调用通知信号时都会评估QML变量,即在以下情况下发出propChanged()。调用emit propChanged()时,该谓词也将重新评估,这很合逻辑,否则状态会不一致。
Q_PROPERTY(QString prop READ getProp WRITE setProp NOTIFY propChanged);
private:
QString m_prop;
public:
void setProp(QString prop) {
if (prop != m_prop) {
m_prop = prop;
// log or break here
emit propChanged();
}
}
QString getProp() const { return m_prop; }
signals:
void propChanged();