QML别名:无法使用图层查找ID

时间:2018-10-04 11:17:20

标签: qt qml

我正在尝试为ShaderEffect做一个别名。但是,当我这样做时:

Item {
    id: root;
    property color colorBackground: Qt.rgba(0.9, 0.9, 0.9, 1.0);
    property color colorStroke: Qt.rgba(0.1, 0.1, 0.1, 1.0);
    layer.enabled: true;

    layer.effect: ShaderEffect {
        property alias colorBackground: root.colorBackground;
        property alias colorStroke: root.colorStroke;

        fragmentShader: "
            uniform lowp sampler2D source; // This item
            uniform lowp float qt_Opacity; // Inherited opacity of this item
            uniform lowp vec4 colorBackground;
            varying highp vec2 qt_TexCoord0;
            void main() {
                lowp vec4 p = texture2D(source, qt_TexCoord0);
                lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156));
                gl_FragColor = colorBackground;
            }";
    }
}

我得到Unable to find id root

当我这样做时:

Item {
    property alias colorBackground: shaderEffect.colorBackground;
    property alias colorStroke: shaderEffect.colorStroke;
    layer.enabled: true;

    layer.effect: ShaderEffect {
        id: shaderEffect;
        property color colorBackground: Qt.rgba(0.9, 0.9, 0.9, 1.0);
        property color colorStroke: Qt.rgba(0.1, 0.1, 0.1, 1.0);
        fragmentShader: "
            uniform lowp sampler2D source; // This item
            uniform lowp float qt_Opacity; // Inherited opacity of this item
            uniform lowp vec4 color;
            varying highp vec2 qt_TexCoord0;
            void main() {
                lowp vec4 p = texture2D(source, qt_TexCoord0);
                lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156));
                gl_FragColor = color;
            }";
    }
}

我遇到相同的错误,但是具有shaderEffect。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

原因是layer.effect is of type Component

Components build their own scope。这意味着ID root仅可通过动态作用域使用。

According to the documentation of property aliases:

  
      
  • 它只能引用在声明别名的类型范围内的对象或对象的属性。
  •   
  • 它不能引用在其类型范围之外声明的对象。
  •   

因此它必须失败。

答案 1 :(得分:1)

layer.effect实际上期望一个Component,它不是对象的实例,而是对象的原型。即使您没有显式设置组件,它也会为您隐式创建。

而且由于您没有具体的对象实例,因此没有id父级可以使用间接的子级可见性,这就是第二个示例不起作用的原因。

alias仅适用于实际的嵌套实例,这种情况在您的情况下没有,子对象是稍后创建的,而不是嵌套在根组件中,这就是第一个示例不起作用的原因

有效方法:

Item {
  id: root;
  property color colorBackground: Qt.rgba(0.9, 0.9, 0.9, 1.0);
  property color colorStroke: Qt.rgba(0.1, 0.1, 0.1, 1.0);
  layer.enabled: true;

  layer.effect: ShaderEffect {
    property color colorBackground: root.colorBackground;
    property color colorStroke: root.colorStroke;

    fragmentShader: "
            uniform lowp sampler2D source; // this item
            uniform lowp float qt_Opacity; // inherited opacity of this item
            uniform lowp vec4 colorBackground;
            varying highp vec2 qt_TexCoord0;
            void main() {
                lowp vec4 p = texture2D(source, qt_TexCoord0);
                lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156));
                gl_FragColor = colorBackground;
            }";
  }
}