[英]Storing a Q_GADGET in a ListModel, it “forgets” about its methods
我有一個錯誤隊列(作為 C++ class 可用作上下文屬性),它可以定期給我一個Error
值列表,它是一個 Q_GADGET。 該小工具具有一組屬性,其中extTimeStamp
也是 JSDate64 類型的自定義JSDate64
。
因此,當我遇到錯誤時,我會將時間戳和消息推送到這樣的ListModel
function collectErrors() {
if( errorQueueController.drainable ) {
for(const error of errorQueue.popErrors()) {
console.log("Time: " + error.extTimeStamp.asDateTime())
errorsModel.append({extTimeStamp: error.extTimeStamp, extMessage: error.extMessage})
}
}
}
可以看出,我在append
之前記錄了時間戳,它也顯示在我連接到ListModel
的Text
委托中
delegate: Text {
color: "white"
text: model.extTimeStamp.asDateTime() + ": " + model.extMessage
}
但事實證明,我只在調試 output 中看到這個:
qml:時間:2016 年 11 月 4 日星期五 00:43:01 GMT+0100
qrc:/views/DummyView2.qml:352: TypeError: object [object Object] 的屬性“asDateTime”不是 ZC1C425268E68385D1AB5074C17A94
即使它是相同的值,當從委托中查詢時,不知何故屬性消失了,我還為我的 Q_GADGET 注冊了一個字符串轉換器,它在append
時工作,但是當我將extTimeStamp
轉換為委托中的字符串時,我只是得到[object Object]
。
此外,我認為如果我為ListModel
啟用dynamicRoles
,一切都會按預期工作。 由於dynamicRoles
的性能要差得多,因此 Qt 手冊不鼓勵使用它,除非絕對需要。 但我不明白這與它有什么關系,因為我根本沒有改變角色的數據類型。 extTimeStamp
角色將永遠是我的JSDate64
-Gadget!
// Why does it work with "dynamicRoles: true"?
ListModel { id: errorsModel; dynamicRoles: true }
您將 Q_GADGET 分配給ListElement
。 ListElement
有一個煩人的特性,看起來它們像任何其他 QML object 一樣擁有屬性,但它們不是屬性。 它們是“角色”,它們只能存儲常量數據,比如字符串。 (見文檔)。 所以它必須自動將你的 Q_GADGET 轉換為它接受的東西,但對你來說不再有用了。 我不確定為什么dynamicRoles
會使它起作用。 也許這允許它對它存儲的對象類型更加松散。
在我看來,一個可能的解決方案是將日期存儲為 model 中的字符串,而不是 object。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.