2016-12-14 88 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

相關問題