2017-08-04 1 views
0

Ich habe eine Qt-Anwendung, die qt_update_values() an die Haupt-QML-Komponente aufruft. Ich möchte die neuen Werte an einen bestimmten Delegaten senden. Wie verbinde ich update_values() von der Hauptkomponente, um von einer bestimmten untergeordneten Komponente empfangen zu werden, die in einem anderen qml definiert ist?QML verbinden Signal von der Hauptkomponente zu den untergeordneten Komponenten

Ich habe versucht, Verbindungen in das Kind zu definieren, aber ich bin nicht sicher, was ich Ziel definieren müssen ...

Im main.qml Ich habe etwas Ähnliches wie folgt aus:

... 
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"} 
    } 
} 
... 

dann auf AnotherComponent.qml ich habe:

... 
signal update_values_child(new_values) 

function onUpdate_values(newValues){ 
    textid = newValues; 
} 

Text{ id:textid} 
... 

Antwort

0

Sie schließen nicht aus dem übergeordneten Haupt, aber umgekehrt wie folgt aus:

... 
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) 
     } 
    } 
} 
... 

Sie könnten auch signal.connect() verwenden, um neue Verbindungen

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

hinzufügen Aber wenn es nur Ausstrahlung einen neuen Wert ist, würde die deklarative Art und Weise sein, haben Eigenschaften in Ihrer Stellvertretung und binden, um sie zu den Eigenschaften, die die changeing Werten gehalten:

... 
id: idOfTheParent 
property var valueThatWillChange 

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

Um alles mit verschiedenen Signalen vonc zu haben. möglich ist:

die für Connections ige Lösung doSomething die einfachste Sache nur zu nennen, wenn es die richtige Delegatinstanz ist:

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

Aber das ist mit der zweiten Methode einfacher:

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) 
    } 
} 
+0

Danke dir @derM. Es tut mehr als nur aktualisieren ... Ich habe die erste Methode versucht, und ich bekomme keine Fehler, aber ich habe eine console.log auf dosomethingWith (new_values) in der Stellvertretung, und es zeigt überhaupt nichts. Es scheint, als ob die Funktion nicht aufgerufen wird ... – laurapons

+1

Entschuldigung mein Fehler, ich habe vergessen, die Parameter am Ende hinzuzufügen. Es klappt! Vielen Dank!!! @derM – laurapons

+0

eine letzte Frage, gibt es eine Möglichkeit, nur bestimmte Delegierte und nicht alle von ihnen zu verbinden (in meinem Beispiel werden Delegaten eine Reihe von Diagrammen sein, die dynamisch sein werden). Ich möchte jedes Diagramm mit einem anderen qt_update_value_chart1 oder qt_update_value_chart2 verbinden ... Ist das möglich? @derM – laurapons

Verwandte Themen