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 Quick Best Practices and Design Patterns(倒退到第 25 分钟),他确实说这件事非常复杂,必须与组件范围有关,但没有时间解释原因。

[更新]

因此,正如 MartinJ 在下面所说,元素属性(不仅是元素子)层次结构中的顶级组件的属性对所有属性可见,无论嵌套多么深,优先级是该属性的属性,以及根本没有看到“中间”项目。

这是一个小例子:

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

乍一看这肯定不直观,但在组件根项中注释掉,原因就很明显了fromColortoColorQML Scope 文档中,您可以看到范围包括:

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

再次,请参阅 Martin 的评论和文档以澄清此事。相关文档是:

于 2012-07-06T21:30:28.913 回答