Как подписаться на какое-то событие, которое запускается каждый раз, когда какое-либо преобразование компонента на основе QML было изменено? Я имею в виду, при изменении любого из: x, y, ширины, высоты, масштаба, поворота, преобразования, любого из этих полей для любого родительского узла по всей иерархии. Возможно, существует какой-то способ сделать код на С ++ для поддержки этого. Мне это нужно для создания компонента, который пересчитывает некоторые поля при изменении преобразования другого компонента.
Для правильной работы мне нужен следующий код:
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 - это функция.





Вы можете уловить изменение любого свойства объекта QML в onPropertyChanged {}. Затем вы можете отправить сигнал nofity или слот вызова из объекта C++:
ShaderEffect {
id: root
signal objectChanged
onXChanged: root.objectChanged()
onYChanged: objectFromContext.someSlot()
}