[Qt-qml] QML connections.

Martin Jones martin.jones at nokia.com
Fri Apr 23 02:05:46 CEST 2010


On Thu, 22 Apr 2010 10:56:38 pm ext Rakesh.Mutharaju at tieto.com wrote:
> Hello,
> 
> I have 3 .qml files pageloader.qml (first file) , A.qml and B.qml. I emit
> signal from A and B on mouse action and which I am capturing in
> pageloader.
> 
> Both A and B have signals "signal aclicked()" and "signal bclicked()" which
> are connected to onAclicked() and onBclicked() signal handlers
> respectively implemented in pageloader.qml. Both the signals are working
> when other is commented. But are not received successively.
> 
> //pageloader.qml
> import Qt 4.7
> Item {
>     width: 200
>     height: 200
>     Loader {
>         id:load
>         source: "A.qml"
>         B{
>             onBclicked:{
>                 load.item.opacity = 0
>                 console.log(load.source)
>                 load.source = ""
>                 console.log("B Clicked!")
>                 console.log("B unloaded status !"+load.status)
>                 load.source = "A.qml"
>                 console.log(load.source)
>                 console.log("A loaded status !"+load.status)
>                 load.item.opacity = 1
>             }
>         }
>         A{
>             onAclicked:{
>                 load.item.opacity = 0
>                 console.log(load.source)
>                 load.source = ""
>                 console.log("A Clicked!")
>                 console.log("A unloaded status !"+load.status)
>                 load.source = "B.qml"
>                 console.log(load.source)
>                 console.log("B loaded status !"+load.status)
>                 load.item.opacity = 1
>             }
>         }
>     }
> }
> 
> //A.qml
> import Qt 4.7
> Rectangle {
>     id: rectangleA
>     width: 200
>     height: 200
>     color: "#0000ff"
>     signal aclicked()
>     Text {
>         x: 72
>         y: 67
>         width: 28
>         height: 48
>         text: "A"
>         font.bold: true
>         font.pointSize: 30
>         anchors.horizontalCenter: parent.horizontalCenter
>         anchors.verticalCenter: parent.verticalCenter
>         MouseArea{
>             //id: areaA
>             anchors.bottomMargin: 0
>             anchors.topMargin: 0
>             anchors.leftMargin: 0
>             anchors.rightMargin: 0
>             anchors.fill: parent
>             Connections {
>                 onClicked:{
>                     console.log("A Clicked!")
>                     rectangleA.aclicked()
>                 }
>             }
>         }
>     }
> }
> 
> //B.qml
> import Qt 4.7
> Rectangle {
>     id: rectangleB
>     width: 200
>     height: 200
>     color: "#ff0000"
>     signal bclicked()
>     Text {
>         x: 72
>         y: 67
>         width: 28
>         height: 48
>         text: "B"
>         font.bold: true
>         font.pointSize: 30
>         anchors.horizontalCenter: parent.horizontalCenter
>         anchors.verticalCenter: parent.verticalCenter
>         MouseArea{
>             //id: areaB
>             anchors.bottomMargin: 0
>             anchors.topMargin: 0
>             anchors.leftMargin: 0
>             anchors.rightMargin: 0
>             anchors.fill: parent
>             Connections {
>                 onClicked:{
>                     console.log("B Clicked!")
>                     rectangleB.bclicked()
>                 }
>             }
>         }
>     }
> }
> 
> From the debug log I notice that
> A Clicked!
> 
> file:///Z:/test_trans/A.qml
> 
> A Clicked!
> 
> A unloaded status !0
> 
> file:///Z:/test_trans/B.qml
> 
> B loaded status !1
> 
> B Clicked! ---->>>>>> signal is lost
> 
> Could someone correct me?

This is what is happening:

At startup, you will have 3 children in the Loader.  A (1), which was set as 
the source in the loader, B (1), which is specified directly as a child of the 
loader, and another A (2), also specified directly as a child of the loader, 
so the hierarchy looks like this:

Item
    Loader
        A  (1)
        B (1)
        A  (2)

Note that the default stacking order, with no z value set, is that the last 
created sibling is on top, so A (2) is the top item and will get the mouse 
click.

Now when that item is clicked the Loader source,  A (1) will be destroyed, and 
a new B (2) will be created, and will become the top item, so your hierarchy 
looks like this:

Item
    Loader
        B (1)
        A  (2)
        B (2)

The next click will go to the newly created B (2), on which you have no 
handler for its onBClicked signal, so nothing happens.

-- 
Martin



More information about the Qt-qml mailing list