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

lau*_*ent 1 qt signals model qobject qml

我有一个包装另一个普通对象的QObject:

#include "qmlnote.h"

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

void QmlNote::reload(const Note &note) {
    note_ = note;
}
Run Code Online (Sandbox Code Playgroud)

我用QML加载它:

ctxt->setContextProperty("note", &qmlNote);
Run Code Online (Sandbox Code Playgroud)

后来我把它换成了另一个音符:

qmlNote.reload(newNote);
Run Code Online (Sandbox Code Playgroud)

然后在QML中,我希望在这个音符改变时做一些事情:

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

Item {

    property QtObject note

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

}
Run Code Online (Sandbox Code Playgroud)

onModelChanged()每当我打电话reload()时,我都会被触发,但它没有发生.我想我需要从某个地方发出一些信号来通知QML视图注释已经改变,但不知道在哪里.我以为我可以发出信号,reload()但似乎QObject没有内置changed信号.

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

dte*_*ech 5

仅当实际对象已更改时,信号才会发出,即,为属性分配了不同的对象.在你的情况下,它将永远是同一个对象.此外,您还没有真正为酒店分配任何东西.如果您已将对象公开为上下文属性,那么这就是您所需要的.

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

Connections {
    target: qmlNote
    onNoteChanged: console.info(qmlNote.title)
}
Run Code Online (Sandbox Code Playgroud)