我正在尝试为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。
我该如何解决这个问题?
答案 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;
}";
}
}