2016-12-14 58 views
0

我有一个QObject,它包装其他纯对象:如何通知QML项目其属性已更改?

#include "qmlnote.h" 

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

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

,我用这个QML中加载:

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

,后来我让换一个不同的音符:

qmlNote.reload(newNote); 

然后在QML,我想要做的事时,这个变化为:

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

Item { 

    property QtObject note 

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

} 

我希望onModelChanged()只要我打电话reload()就会触发,但不会发生。我想我需要从某处发出一些信号来通知QML视图该注释已经改变,但不知道在哪里。我以为我可以从reload()发出信号,但似乎QObject没有内置的changed信号。

有关如何处理这个问题的任何建议?

回答

3

只有当实际物体发生变化时,信号才会发射,也就是说,一个不同的物体被分配给物体。在你的情况下,它将永远是同一个对象。此外,你还没有真正分配任何东西给财产。如果您已经将对象暴露为上下文属性,那么这就是您所需要的。

您可以简单地实现一个信号noteChanged()并在每次重新加载C++时发出它。在qml方面,您可以使用Connections元素来实现它的处理程序。

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

完美,非常感谢 –

+0

此外,如果你做“标题”一个对你'QmlNote'类属性,你可以在任何属性绑定使用'note.title',它会得到重新读取时你发出该属性的更改信号 –

+0

我会建议,但示例代码不会在绑定中使用它。实施适当的财产是大多数情况下的一个好主意。 – dtech

相关问题