【问题标题】:QML How to catch component transformation changeQML 如何捕捉组件转换变化
【发布时间】:2018-08-31 19:30:06
【问题描述】:

当某些基于 QML 项目的组件转换发生更改时,如何订阅每次触发的事件?我的意思是,当更改以下任何一项时:x、y、宽度、高度、比例、旋转、变换、所有层次结构中任何父节点的任何这些字段。可能存在某种方式来制作支持这一点的 c++ 代码。 我需要这个来制作当其他组件转换发生变化时重新计算一些文件的组件。

我需要以下代码才能正常工作:

import QtQuick 2.9
import Mirror 1.0
import QtGraphicalEffects 1.0

ShaderEffect {
    id: se

    property var imageSource
    property var maskSource
    property var faceSource

    x: imageSource.x
    y: imageSource.y
    width: imageSource.width
    height: imageSource.height
    rotation: imageSource.rotation
    scale: imageSource.scale
    //transform: imageSource.transform

    property real px
    property real py

    property real ux
    property real uy

    property real vx
    property real vy

    Connections {
        target: face
        onFaceChangeFinish: {
            se.px = (se.mapToItem(maskSource, 0, 0).x) / maskSource.width;
            se.py = (se.mapToItem(maskSource, 0, 0).y) / maskSource.height;
            se.ux = (se.mapToItem(maskSource, se.width, 0).x) / maskSource.width - se.px;
            se.uy = (se.mapToItem(maskSource, se.width, 0).y) / maskSource.height - se.py;
            se.vx = (se.mapToItem(maskSource, 0, se.height).x) / maskSource.width - se.px;
            se.vy = (se.mapToItem(maskSource, 0, se.height).y) / maskSource.height - se.py;
        }
    }

    property var source : ShaderEffectSource {
        sourceItem: imageSource
    }

    property var bodyMask : ShaderEffectSource {
        sourceItem: maskSource
    }

    fragmentShader:
        "
            varying highp vec2 qt_TexCoord0;
            uniform sampler2D source;
            uniform sampler2D bodyMask;
            uniform float px;
            uniform float py;
            uniform float ux;
            uniform float uy;
            uniform float vx;
            uniform float vy;
            void main() {

                vec2 p = vec2(px, py);
                vec2 u = vec2(ux, uy);
                vec2 v = vec2(vx, vy);
                vec2 uv = p + u * qt_TexCoord0.x + v * qt_TexCoord0.y;
                gl_FragColor =
                    texture2D(source, qt_TexCoord0) *
                    (1.0 - texture2D(bodyMask, uv).w);
            }
        "
}

这是支持任何转换或层次结构的 OpacityMask 的代码。 我需要用一些东西代替“连接”部分来处理所有改变掩码或源图像转换的情况。 在这种情况下,属性绑定没有帮助,因为 mapToItem 是函数。

【问题讨论】:

    标签: c++ qt qml


    【解决方案1】:

    您可以在 onPropertyChanged{} 中捕捉到 QML 对象的任何属性的变化。然后你可以从 C++ 对象发送 nofity 信号或调用 slot:

    ShaderEffect {
      id: root
      signal objectChanged
    
      onXChanged: root.objectChanged()
      onYChanged: objectFromContext.someSlot()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      相关资源
      最近更新 更多