我有一个错误队列(作为一个可作为上下文属性的c++类),它可以定期给我一个Error
值列表,这是一个Q_GADGET。小工具有一组属性,其中extTimeStamp
也是一个自定义的Q_GADGET,类型为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
之前记录时间戳,它也显示在Text
委托中,我将其连接到ListModel
delegate: Text {
color: "white"
text: model.extTimeStamp.asDateTime() + ": " + model.extMessage
}
但事实证明,我只在调试输出中看到这个:
qml:时间:Fri Nov 4 00:43:01 2016 GMT+0100
独有://DummyView2观点。qml:352: TypeError: object [object object]的属性'asDateTime'不是函数
尽管它是相同的值,但当从委托中查询时,属性不知何故消失了!我还为我的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对象一样拥有属性,但它们不是属性。它们是"角色",它们只能存储常量数据,比如字符串。(参见文档)。因此,它必须自动将Q_GADGET转换为它可以接受但对您不再有用的内容。我不太确定为什么dynamicRoles
会让它工作。也许这允许它对存储的对象类型更宽松。
它看起来像一个可能的解决方案,你可以存储日期作为一个字符串在你的模型,而不是作为一个对象。