Как добавить обработчик событий для динамически созданных элементов QML?

Я динамически добавил некоторые qml-компоненты в свой gui в соответствии с этим сообщением в блоге. Как добавить обработчики событий для вновь созданных компонентов?

Ответ 1

Я объясню пример. 1) Создайте компонент пользовательской кнопки следующим образом

//Button.qml ... This component objects will be dynamically
// created
import QtQuick 2.1

Rectangle {
    width: 100
    height: 50
    color:"blue"
    //Since the buttons are created on the fly,
    //we need to identify the button on which the user
    // has clicked. The id must be unique
    property string buttonId;
    signal clicked(string buttonId);

    MouseArea {
        anchors.fill: parent
        onClicked:parent.clicked(parent.buttonId)
    }
}

Это простая кнопка, которая нажимает на нее щелчок. Теперь давайте создадим несколько кнопок на лету.

//Main.qml ... creates some buttons on the fly
import QtQuick 2.1
Rectangle{
    id:root
    width:500
    height:500

    function buttonClicked(buttonId)
    {
        console.debug(buttonId);
    }

    function createSomeButtons()
    {
        //Function creates 4 buttons
        var component = Qt.createComponent("Button.qml");
        for(var i=0;i<4;i++)
        {
            var buttonY = i*55; //Button height : 50 + 5 unit margin
            var button = component.createObject(root,{"x":0,"y":buttonY,"buttonId":i+1});

            //Connect the clicked signal of the newly created button
            //to the event handler buttonClicked.
            button.clicked.connect(buttonClicked)
        }
    }
    Component.onCompleted: {
        createSomeButtons();
    }
}

Здесь, когда создание компонента Main.qml завершено, создаются кнопки. 4 кнопки и после создания каждой кнопки функция javascript buttonClicked подключается как обработчик событий к сигналу "Button.qml". Всякий раз, когда пользователь нажимает на кнопку, функция buttonClicked будет вызываться с параметром buttonId в качестве аргумента. Вы можете делать все, что хотите, в обработчике событий.