[Development] QML Signal handlers order.

filippocucchetto at gmail.com filippocucchetto at gmail.com
Tue May 17 20:07:34 CEST 2016


On martedì 17 maggio 2016 17:58:27 CEST Sorokin Vasiliy wrote:
> Hello.
> 
> Example:
> 
> MyButton.qml
> 
> import QtQuick 2.5
> 
> import QtQuick.Controls 1.4
> 
> 
> Button {
> 
>     onClicked: {
> 
>         console.log("inner")
> 
>     }
> 
> }
> 
> 
> mail.qml
> 
> import QtQuick 2.5
> 
> import QtQuick.Window 2.2
> 
> import QtQuick.Controls 1.4
> 
> Window {
> 
>     visible: true
> 
> 
>     MyButton {
> 
>         text: "OK"
> 
>         onClicked: {
> 
>             console.log("outter")
> 
>         }
> 
>     }
> 
> }
> 
> 
> When I click on button I got this output:
> 
> 
> qml: inner
> 
> qml: outter
> 
> And my question is:
> 
> Is this calls order guaranteed?
> 
> --
> Best Regards,
> Vasiliy Sorokin

Hi,
AFAIK you shouldn't rely on any order of execution of slots invoked by a 
signal invokation. 
See http://doc.qt.io/qt-5.6/signalsandslots.html#signals in particular
"""
If several slots are connected to one signal, the slots will be executed one 
after the other, in the order they have been connected, when the signal is 
emitted.
"""
Obviously what you wrote it's just a little example but there're lot of ways 
to solve it:
1) Add a different signal to My Button

Button {
    ...
    signal afterClicked()

   onClicked: {
        // Do something
        afterClicked()
   }
}

2) Hide the inner clicked signal
Item {
    id: root

    signal clicked()

    Button {
         onClicked: { 
               // Do something
               root.clicked() 
         }
    }
}





More information about the Development mailing list