DrCataclysm
DrCataclysm

Reputation: 33

QML Event before and after property change

Are there any signals I can bind to that allow me to execute functions directly before and directly after a property changes?

For example something like this:

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()
    }
}

I want to call the cacheImage() function right before the canvas's size changes and the loadImageFromCache() right after the resize is completed.

If I understand correctly the onWidthChanged and onHeightChanged do the latter, but I need to save the image before it does that. Is there a simple way to do this?

Upvotes: 1

Views: 2411

Answers (2)

But cacheImage() doesn't have to be called right before the size changes! It needs to be called any time after the most recent canvas contents change, and before the new canvas size takes effect. The window to cache the canvas is very long and extends between changes. The event "before n-th property change" is simply "after (n-1)-th property change" :)

Upvotes: 1

dtech
dtech

Reputation: 49329

This kind of functionality is not part of the "core design intent" of QML, so you are not getting it out of the box.

It is quite easy to do for C++ objects when you get to implement your own setter function.

But even in QML you can simply use an auxiliary setter function rather than using the property directly:

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

If you insist on using a property based syntax, you can use an additional auxiliary property:

property type auxProp
onAuxPropChanged: setSomeProp(auxProp)

Which will allow you to use the = operator as well as do bindings.

Upvotes: 1

Related Questions