Qt 如何通知QML项其属性已更改?

Qt 如何通知QML项其属性已更改?,qt,model,qml,signals,qobject,Qt,Model,Qml,Signals,Qobject,我有一个QObject,它包裹了另一个普通对象: #include "qmlnote.h" QString QmlNote::title() const { return note_.title(); } void QmlNote::reload(const Note &note) { note_ = note; } 我使用以下命令将其加载到QML中: ctxt->setContextProperty("note", &qmlNote); 后来我把它

我有一个QObject,它包裹了另一个普通对象:

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

}
我希望无论何时调用
reload()
都能触发
onModelChanged()
,但这不会发生。我想我需要从某个地方发出一些信号来通知QML视图注释已更改,但不确定在哪里。我以为我可以从
reload()
发出一个信号,但似乎
QObject
没有内置的
已更改的信号


关于如何处理此问题的任何建议?

只有当实际对象发生变化时,即为属性指定了不同的对象,才会发出信号。在您的情况下,它将始终是同一个对象。此外,您还没有为该属性分配任何内容。如果您已经将对象作为上下文属性公开,那么这就是您所需要的

你可以简单地实现一个信号NOTEXEDE()/<代码>,并在C++中的每个重新加载中发出它。在qml端,您可以使用

Connections
元素为其实现处理程序

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

另外,如果您在
QmlNote
类中将“title”作为属性,您可以在任何属性绑定中使用
note.title
,当您发出该属性的更改信号时,它将被重新读取。我会建议这样做,但示例代码在绑定中不使用它。在大多数情况下,实现适当的属性是一个好主意。