ChildAt() in QML , a question .i need help,thank you!



  • i am a new learner in QML, i want to make a little game.
    so ,in mousearer,i want to click a Lable ,and make it to move ,i use the childAt(mouseX,mouse Y) to capture it.

    but ,i do not know how to use childAt,i need help.
    thank you!


  • Moderators

    Please, use correct interpunction, your post is very hard to read.

    If you don't know how to use this at all, read the docs. If you have any specific problem, please specify what is wrong.


  • Moderators

    Perhaps this is what you want,

    @
    import QtQuick 2.0
    import QtQuick.Controls 1.0

    Rectangle {
    width: 800
    height: 480
    Text {
    text: qsTr("Drag the two labels")
    anchors.centerIn: parent
    }

    Label {
        id: l1
        text: "Label 1"
        x: 50
        y: 50
        width: 100
        height: 100
        color: "red"
    
        MouseArea {
            anchors.fill: parent
            property variant previousPosition
            onPressed: {
                previousPosition = Qt.point(mouseX, mouseY)
            }
            onPositionChanged: {
                if (pressedButtons == Qt.LeftButton) {
                    var dx = mouseX - previousPosition.x
                    var dy = mouseY - previousPosition.y
                    l1.x = l1.x + dx;
                    l1.y = l1.y + dy;
                }
            }
        }
    }
    
    Label {
        id: l2
        text: "Label 2"
        x: 100
        y: 100
        width: 100
        height: 100
        color: "orange"
    
        MouseArea {
            anchors.fill: parent
            property variant previousPosition
            onPressed: {
                previousPosition = Qt.point(mouseX, mouseY)
            }
            onPositionChanged: {
                if (pressedButtons == Qt.LeftButton) {
                    var dx = mouseX - previousPosition.x
                    var dy = mouseY - previousPosition.y
                    l2.x = l2.x + dx;
                    l2.y = l2.y + dy;
                }
            }
        }
    }
    

    }

    @



  • Thank you ,p3c0!
    But,i want to automatically capture the Lable ,which in the Rectangle.
    eg: l1 is captured by (mouseX,mouseY).
    so i think childAt() can be used. But i cannot use it.


  • Moderators

    Sorry but i didn't get you. In your first post you said you want to click the label and and move it.
    How would you get the X an Y coordinates of the item unless you click it or you know in advance the position of each label ?
    Can you elaborate more your problem ?



  • hi,p3c0.
    thank you for your help.
    in my program. i defined 7 lables.

    Mousearea{
    anchors.fill:parent
    onClicked:{
    var click;
    click = mapToItem(parent,mouseX,mouseY);
    parent.childAt(click.x,click.y).anchors.leftMargin = 50;
    ...
    }
    }

    like these,i want capture a lable by (mouseX,mouseY),but ,in running,
    my program return wrong value.


  • Moderators

    Hi,

    Considering your requirement i implemented the following and it gives the item (its objectName )when clicked on it,

    @
    import QtQuick 2.0
    import QtQuick.Controls 1.0

    Rectangle {
    id: rect
    width: 800
    height: 480
    Text {
    text: qsTr("Click on each item")
    anchors.centerIn: parent
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            var click;
            click = mapToItem(parent,mouseX,mouseY)
            var obj = parent.childAt(mouseX,mouseY)
            console.log(obj.objectName)
        }
    }
    
    Label {
        id: l1
        objectName: "l1"
        text: "Label 1"
        x: 50
        y: 50
        width: 100
        height: 100
        color: "red"
    }
    
    Label {
        id: l2
        objectName: "l2"
        text: "Label 2"
        x: 100
        y: 100
        width: 100
        height: 100
        color: "orange"
    }
    
    Rectangle {
        objectName: "r2"
        width: 200
        height: 200
        x: 500
        y: 100
        color: "red"
    }
    

    }
    @

    The MouseArea code is similar to your's but i moved it to the top before adding the two labels and the rect. If i move the MouseArea code after creation of labels and the rect it gives QQuickMouseArea as the child.
    Hope this is what you want.



  • Thank you, p3c0.
    your answer is my need ,thank you so much!


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.