10

このコードを取る:

import QtQuick 1.1

Rectangle {
    width:  100
    height: 100

    property color fromColor: "red"
    property color toColor:   "blue"

    gradient: Gradient {
        property color fromColor: "yellow"
        property color toColor:   "green"

        GradientStop { position: 0; color: fromColor }
        GradientStop { position: 1; color: toColor }
    }
}

囲んでいる要素からそのプロパティとプロパティを正確にGradient選択するのはなぜですか?fromColortoColor

これはどこに文書化されていますか(少なくともソースコードコメント内、公式ドキュメント内でより適切です)?

注:この「QML難読化の例は、Girish Ramakrishnanの講演Qtクイックベストプラクティスとデザインパターン(25分に巻き戻す)からのものです。彼は、物事は非常に複雑で、コンポーネントスコープなどに関係していると述べていますが、時間がありません。理由を説明します。

[アップデート]

したがって、MartinJが以下に示すように、element-property(element-childだけでなく)階層の最上位コンポーネントは、そのプロパティがすべてのプロパティに表示されますが、そのプロパティのプロパティが優先され、全く見られない「中級」アイテム。

これが小さな例です:

import QtQuick 1.1

Item {
    Item {
        property string s: "parent-str"
        Item { Component.onCompleted: console.log(s) }
    }
}

これは与える:"ReferenceError: Can't find variable: s"

そして、これは期待どおりに機能します。

import QtQuick 1.1

Item {
    property string s: "parent-str"
    Item { Component.onCompleted: console.log(s) }
}

、出力"parent-str"

以下のMartinJのコメントをご覧ください。

4

2 に答える 2

7

これは確かに一見直感的ではないように見えますが、コンポーネントのルート項目をコメントアウトして、その理由が明らかになりますfromColorQML Scope docstoColorから、スコープに以下が含まれていることがわかります。

  • idコンポーネント内で定義されたすべての。
  • ローカル プロパティ
  • コンポーネントのルート オブジェクトのプロパティ

上記の例の AGradientStop {}には、ローカル プロパティが定義されていません。ルート コンポーネントはそうであり、それらは解決されるプロパティfromColorですtoColor。のプロパティはGradient {}の範囲にはまったく含まれていませんGradientStop {}

于 2012-07-05T23:49:17.433 に答える
0

これも参照してください:

import QtQuick 1.1

Item {
    property string s: "outer"

    Item {
        property string s: "middle"

        property Item it: Item {
            property string dummy: function() { console.log("(5) s: "+s); "" }()
            Component.onCompleted: console.log("(1) s: " + s)
        }

        Item {
            property string dummy: function() { console.log("(4) s: "+s); "" }()

            function f() {
                console.log("(2) s: " + s)
            }

            Component.onCompleted: {
                console.log("(3) s: " + s)
                f()
            }
        }
    }
}

このコードは次を出力します。

(5) s: outer
(4) s: outer
(3) s: outer
(2) s: outer
(1) s: outer

ただし、(Children プロパティに対してかどうかに関係なく) 何を (要素または JavaScript コード スニペットに) バインドしても、「中間」プロパティは決して見つからないことに注意してください。

したがって、名前のルックアップは次のようになります。

  1. Item または Component 内で定義された ID (3 を参照)
  2. ローカル プロパティ
  3. 最上位アイテムのプロパティ (デリゲートが便利に定義されている場合のように、「コンポーネント」名が省略されている場合でも、インラインで定義されている場合はコンポーネント)。

また、プロパティがコンポーネント内で参照されているが、その中で定義されていない場合でも、「カスタマイズされた」コンポーネント内に導入され、表示される可能性があります。

//OverrideInner.qml
import QtQuick 1.1

Item {
    Component.onCompleted: console.log(s)
}

.

//OverrideOuter.qml
import QtQuick 1.1

Item {
    property string s: "overriden-outer"

    Item {
        property string s: "overriden-middle"

        OverrideInner {
            property string s: "overriden-inner"
        }
    }
}

「OverrideOuter.qml」を実行すると、以下が生成されます。

overriden-inner

繰り返しますが、マーティンのコメントとドキュメントを参照して、問題を明確にしてください。関連するドキュメントは次のとおりです。

于 2012-07-06T21:30:28.913 に答える