Сигнал подключения QML от основного компонента к дочерним компонентам

У меня есть приложение Qt, которое вызывает qt_update_values() для основного компонента QML. Я хочу отправить новые значения конкретному делегату. Как подключить update_values() из основного компонента для получения определенным дочерним компонентом, который определен в другом qml?

Я попытался определить соединения в дочернем элементе, но я не уверен, какую цель мне нужно определить...

В main.qml у меня есть что-то похожее на это:

...
signal update_values(new_values)

function qt_update_values(newValues){
     update_values(newValues);
}

Repeater {
     id:idRepeater
     model: 3

     Rectangle {
         id:example

         Text{ text: "hello"}
         ...

         AnotherComponent {name: "name", othervariables: "others"}
     }
}
...

Затем на AnotherComponent.qml у меня есть:

...
signal update_values_child(new_values)

function onUpdate_values(newValues){
     textid = newValues;
}

Text{ id:textid}
...

person laurapons    schedule 04.08.2017    source источник


Ответы (1)


Вы не подключаетесь от родителя к основному, а наоборот:

...
id: idOfTheParent  // <=== THIS IS IMPORTANT
signal update_values(new_values)

function qt_update_values(newValues){
     update_values(newValues);
}

Repeater {
    id:idRepeater
    model: 3

    Rectangle {
        id:example

        Text{ text: "hello"}
        ...

        AnotherComponent {
            id: idOfAnotherComponent // This ID is only available in the 
                                     // scope of the Component
                                     // that will be instantiated by the
                                     // Repeater, i.e. children of the Rectangle
            name: "name"
            othervariables: "others"
        }
        Connections {
            target: idOfTheParent
            onUpdate_values: idOfAnotherComponent.dosomethingWith(new_values)
        }
    }
}
...

Вы также можете использовать signal.connect() для добавления новых подключений.

Repeater {
    model: 10
    delegate: Item { ... }
    onItemAdded: {
        idOfTheParent.update_values.connect(function() { // do what you want })
    }
}

Но если это только широковещательная передача нового значения, декларативный способ будет состоять в том, чтобы иметь свойства в вашем делегате и привязывать их к свойствам, которые содержат изменяющиеся значения:

...
id: idOfTheParent
property var valueThatWillChange

Repeater {
    model: 10
    delegate: Item {
        property int valueThatShallChangeToo: idOfTheParent.valueThatWillChange
    }
}
...

Чтобы все это было с разными сигналами ofc. возможно:

Для Connections-решения проще всего вызвать doSomething только в том случае, если это правильный экземпляр делегата:

// in the delegate
Connections {
    target: idOfTheParent
    onValue1Updated: if (index === 1) doYourStuff()
    onValue2Updated: if (index === 2) doYourStuff()
    onValue...
}

Но это проще со вторым способом:

id: idOfTheParent
Repeater {
    model: 10
    delegate: SomeItem {
        function doSomething() { console.log(index, 'does something')
    }
    onItemAdded: {
        idOfTheParent['value' + index + 'Updated'].connect(item.doSomething)
    }
    onItemRemoved: {
        idOfTheParent['value' + index + 'Updated'].disconnect(item.doSomething)
    }
}
person derM    schedule 04.08.2017
comment
спасибо тебе @derM. На самом деле это больше, чем просто обновление... Я пробовал первый метод и не получил ошибок, но я установил console.log на dosomethingWith(new_values) в делегате, и он вообще ничего не показывает. Кажется, что функция не вызывается... - person laurapons; 04.08.2017
comment
извините за ошибку, я забыл добавить параметры в конце. Оно работает! Спасибо!!! @derM - person laurapons; 04.08.2017
comment
последний вопрос, есть ли способ подключить только определенные делегаты, а не все из них (в моем примере делегаты будут сериями диаграмм, которые будут динамическими). Я хочу связать каждую диаграмму с другим qt_update_value_chart1 или qt_update_value_chart2... Возможно ли это? @derM - person laurapons; 04.08.2017