财产变更前后的QML事件

时间:2018-02-01 13:34:07

标签: qt qml qtquick2

是否有任何可以绑定的信号允许我在属性更改之前和之后直接执行函数?

例如:

Canvas {
    id: canvas
    anchors.fill: parent

    property real lastX
    property real lastY

    property var lastContext

    function cacheImage(){
        lastContext = canvas.context
    }

    function loadImageFromCache(){
        canvas.context = lastContext
        canvas.requestPaint()
    }
}

我想在画布大小更改之前调用cacheImage()函数,在调整大小完成后调用loadImageFromCache()

如果我理解正确onWidthChangedonHeightChanged执行后者,但我需要先保存图像。有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这种功能不属于QML的“核心设计意图”,所以你不是开箱即用的。

当你实现自己的setter函数时,对C ++对象来说很容易。

但即使在QML中,你也可以简单地使用辅助setter函数而不是直接使用属性:

function setSomeProp(newValue) {
  if (newValue === oldValue) return
  stuffBeforeChange()
  oldValue = newValue
  stuffAfterChange() // optional, you can use the default provided signal too
}

如果您坚持使用基于属性的语法,则可以使用其他辅助属性:

property type auxProp
onAuxPropChanged: setSomeProp(auxProp)

这将允许您使用=运算符以及绑定。

答案 1 :(得分:0)

但在尺寸变化之前,不必调用cacheImage()!在最近的画布内容更改之后,以及在新的画布大小生效之前,需要随时调用它。缓存画布的窗口很长,并且在更改之间进行扩展。事件"在第n次财产变更之前"简单地说是在第(n-1)次财产变更之后#34; :)