2016-12-14 1 views
0

J'ai un QObject qui enveloppe un autre objet simple:Comment notifier un élément QML que sa propriété a changé?

#include "qmlnote.h" 

QString QmlNote::title() const { 
    return note_.title(); 
} 

void QmlNote::reload(const Note &note) { 
    note_ = note; 
} 

que je charge en QML en utilisant ceci:

ctxt->setContextProperty("note", &qmlNote); 

et plus tard je fais envelopper une note différente:

qmlNote.reload(newNote); 

Puis, en QML, je veux faire quelque chose quand ce changement de note:

import QtQuick 2.0 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.1 

Item { 

    property QtObject note 

    onNoteChanged: { 
     console.info(note.title) 
    } 

} 

Je voudrais onModelChanged() être déclenché chaque fois que j'appelle reload() mais ce n'est pas le cas. Je suppose que je devrais émettre des signaux de quelque part pour informer la vue QML que la note a changé, mais je ne sais pas où. Je pensais que je pouvais émettre un signal de reload() mais il semble que QObject n'a pas de signal changed intégré.

Une suggestion sur la façon de gérer cela?

Répondre

3

Le signal ne sera émis que si l'objet réel a été modifié, c'est-à-dire qu'un objet différent est affecté à la propriété. Dans votre cas, ce sera toujours le même objet. De plus, vous n'avez pas vraiment assigné quoi que ce soit à la propriété. Si vous avez déjà exposé l'objet en tant que propriété de contexte, c'est tout ce dont vous avez besoin.

Vous pouvez simplement implémenter un signal noteChanged() et l'émettre à chaque rechargement en C++. Du côté qml, vous pouvez utiliser un élément Connections pour implémenter un gestionnaire correspondant.

Connections { 
    target: qmlNote 
    onNoteChanged: console.info(qmlNote.title) 
} 
+0

parfait, merci beaucoup –

+0

En outre, si vous faites « titre » une propriété sur votre classe 'QmlNote', vous pouvez simplement utiliser' note.title' dans une propriété de liaison et il va se relus lorsque vous avez émis le signal de changement de cette propriété –

+0

Je l'aurais suggéré, mais l'exemple de code ne l'utilise pas dans une liaison. La mise en œuvre d'une propriété appropriée est une bonne idée dans la plupart des cas. – dtech