このページでは

古くなったプロパティの読み取り

この警告カテゴリは、qmllint では「[stale-property-read] 」と表記されます。

定数でも通知対象でもないプロパティの読み取り

何が起きたのか?

バインディング内で、定数でもなく通知可能でもないプロパティが使用されています。

なぜ問題なのか?

定数プロパティの値は決して変化しません。通知可能プロパティは、値が変化した際に、それに依存するバインディングに通知を行い、バインディングが再評価できるようにします。

このプロパティは定数でも通知可能でもないので、プログラムの実行中に値が変更されても、依存するバインディングに通知されることはありません。その結果、バインディングの値はこのプロパティに依存しているため、バインディングが古い状態のままになる可能性があります。

例

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...
    }
}

この警告を解消するには、プロパティの値が変化しない場合はそれを定数としてマークするか、通知可能にする必要があります。

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...
    }
}

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.