簡體   English   中英

將 Q_GADGET 存儲在 ListModel 中,它會“忘記”它的方法

[英]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之前記錄了時間戳,它也顯示在我連接到ListModelText委托中

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM