gpt4 book ai didi

c++ - QML 如何捕捉组件转换变化

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:11 25 4
gpt4 key购买 nike

当一些基于 QML Item 的组件转换发生变化时,如何订阅每次触发的事件?我的意思是,当更改以下任何一项时: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 代码。我需要用一些东西替换“连接”部分,以处理所有更改蒙版或源图像转换的情况。属性绑定(bind)在这种情况下没有帮助,因为 mapToItem 是函数。

最佳答案

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

ShaderEffect {
id: root
signal objectChanged

onXChanged: root.objectChanged()
onYChanged: objectFromContext.someSlot()
}

关于c++ - QML 如何捕捉组件转换变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49427333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com