4 votes

La liaison C++ bidirectionnelle de QML ne reçoit plus de modifications

Je suis confronté à un gros problème qui prend beaucoup de temps à être résolu parce que je n'en connais pas la cause et que je ne sais pas comment le résoudre. Le problème est très simple : J'ai un exemple de composant QML défini comme suit :

Rectangle {
    id: rect
    property bool test: myclass.testproperty

    Rectangle {
        width: 50
        height: 50
        visible: parent.test
    }
}

et j'ai connecté un signal MouseArea onClicked pour ce faire :

test = !test

Je modifie donc la valeur de la variable booléenne. Pour faire passer la valeur de C++ à QML et de QML à Q_PROPERTY C++ avec les signaux READ, WRITE et NOTIFY, j'ai utilisé ceci

Binding {
    target: myclass
    property: "testproperty"
    value: rect.test
}

tout fonctionne bien jusqu'à ce que je clique sur la mouseArea et que je transmette les modifications par le biais de la liaison. Après cela, chaque fois que j'essaie de définir une nouvelle valeur de propriété à partir de C++, je ne vois aucun changement dans QML, comme si le binding était détruit. Mais si j'essaie de cliquer sur la MouseArea, j'appelle toujours la méthode setTestProperty de la classe C++. En fait, il y a une désynchronisation entre C++ et QML. Pourquoi ? Je ne trouve pas le problème, le signal est émis parce que QSignalSpy me donne 1 comme nombre de fois où il a été émis après avoir utilisé

emit this->testPropertyChanged(newvalue)

EDIT

Voici un exemple : nous utilisons une propriété QString avec les mêmes signaux. La seule chose qui change est qu'au lieu d'utiliser un élément QML Rectangle et de le lier à une propriété propre, j'utilise un élément TextInput.

TextInput {
    id: mytext
    text: myclass.testproperty
}

Binding {
    target: myclass
    property: "testproperty"
    value: mytext.text
}

7voto

Pavel Osipov Points 872

Il n'y a pas de problème. Il s'agit d'un comportement standard des liaisons QML. Lorsque vous modifiez une propriété d'un widget QML dans le code JavaScript, toutes les liaisons déclaratives qui s'y rapportent sont supprimées. Il vous appartient d'utiliser les liaisons déclaratives ou de mettre à jour les valeurs manuellement dans le code JS des gestionnaires d'événements.

EDIT

Rectangle {
    id: rect

    // Establishing initial value for 'test' property via QML binding
    property bool test: myclass.testproperty

    // Manual update of 'test' property when binding will be broken
    Connections {
        target: myclass
        onTestpropertyChanged: {
            rect.test = xxx
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X