Stale property read

This warning category is spelled [stale-property-read] by qmllint.

Reading non-constant and non-notifiable property

What happened?

A property that is both non-constant and non-notifyable is used in a binding.

Why is that bad?

Constant properties never change in value. Notifiable properties notify bindings depending on them when they change in value so the bindings can re-evaluate.

Because this property is neither constant nor notifiable, it could change during the program's execution without notifying dependent bindings. This would leave the bindings in a potentially outdated state, as their value depends on the property.

Example

 class Circle : public QObject
 {
     Q_OBJECT
     QML_ELEMENT
     Q_PROPERTY(double radius READ radius WRITE setRadius FINAL)
 public:
     double radius() const { return m_radius; }
     void setRadius(double radius) { m_radius = radius; }
 private:
     double m_radius = 1;
 };
 import QtQuick

 Item {
     Circle {
         id: circle
         property double area: Math.PI * radius * radius
     }

     Component.onCompleted: {
         console.log(circle.area) // 3.14159...
         circle.radius = 2
         console.log(circle.area) // 3.14159...
     }
 }

To fix this warning, either mark the property as constant if it will not change in value or make it notifiable.

 class Circle : public QObject
 {
     Q_OBJECT
     QML_ELEMENT
     Q_PROPERTY(double radius READ radius WRITE setRadius NOTIFY radiusChanged FINAL)
 public:
     double radius() const { return m_radius; }
     void setRadius(double radius) {
         if (radius != m_radius) {
             m_radius = radius;
             emit radiusChanged();
         }
     }
 signals:
     void radiusChanged();
 private:
     double m_radius = 1;
 };
 import QtQuick

 Item {
     Circle {
         id: circle
         property double area: Math.PI * radius * radius
     }

     Component.onCompleted: {
         console.log(circle.area) // 3.14159...
         circle.radius = 2
         console.log(circle.area) // 12.5663...
     }
 }