3 votes

QT QML Accéder à une propriété attachée depuis un autre objet QML

Main.qml :

import QtQuick 2.11
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

ApplicationWindow {
    id: window
    x: 200
    y: 200
    visible: true

    Component {
        id: firstViewComponent
        FirstView {
            id: firstView
        }
    }

    StackView {
        id: stackView
        anchors.fill: parent
        Component.onCompleted: push(firstViewComponent)
    }

    Timer {
          interval: 1000
          running: true
          onTriggered: stackView.pop()
    }
}

FirstView.qml :

Rectangle {
    id: view
    StackView.onDeactivating: console.log('view: view is deactivating')

    ListModel {
        id: aModel
        ListElement {
            name: 'Element 0'
        }
        ListElement {
            name: 'Element 1'
        }
    }

    ListView {
        id: listView
        model: aModel

        delegate: Rectangle {
            id: listViewDelegate
            Connections {
                target: view.StackView  // <---- DOESN'T WORK
                onDeactivating: console.log('delegate ' + index + ': needs to do some housekeeping now')
            }
        }    
    }
}

J'ai une vue qui est instanciée par un StackView dans main.qml. Le StackView attache un signal StackView.onDeactivating à la vue. Existe-t-il un moyen de s'attacher au signal à partir d'un objet autre que celui auquel le signal est attaché ? J'ai besoin d'effectuer un certain nettoyage dans le listViewDelegate lorsque la vue est désactivée.

Je pourrais faire en sorte que la vue émette son propre signal, et que le délégué réponde à ce signal. Mais ce que je me demande, c'est s'il existe un moyen de se connecter au signal attaché : StackView.onDeactivating à partir d'un objet différent (listViewDelegate).

4voto

Felix Points 4118

Oui et non. La documentation de Qt aborde partiellement cette question : Remarque sur l'accès aux propriétés attachées et aux gestionnaires de signaux

Il n'est pas possible de directement accéder à la propriété depuis un enfant. Les propriétés attachées doivent être explicitement lues par la classe qui les fournit. Dans votre exemple, la classe parent ( StackView ) recherche simplement toutes les propriétés attachées qu'il fournit dans l'élément enfant ( FirstView ) dès qu'il est ajouté, et gère toutes les propriétés/signaux trouvés, etc. en les connectant en interne à la logique qui les fournit.

Cependant, rien ne vous empêche d'obtenir la propriété attachée à partir de l'élément parent, tant que vous vous y référez par l'id :

sampleProp: view.StackView.someProperty

Le truc c'est que : Cet accès indirect ne fonctionne de cette façon que pour les propriétés et pas pour les signaux, car vous ne pouvez pas simplement vous référer à l'objet attaché via view.StackView - Malheureusement, vous êtes obligé de transmettre le signal aux éléments enfants indirectement en créant un second signal dans l'élément racine et en l'émettant lorsque le signal attaché est émis.

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