在列表模型中存储Q_GADGET,它"forgets"其方法



我有一个错误队列(作为一个可作为上下文属性的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分配给ListElementListElement有一个令人讨厌的特性,看起来它们像其他QML对象一样拥有属性,但它们不是属性。它们是"角色",它们只能存储常量数据,比如字符串。(参见文档)。因此,它必须自动将Q_GADGET转换为它可以接受但对您不再有用的内容。我不太确定为什么dynamicRoles会让它工作。也许这允许它对存储的对象类型更宽松。

它看起来像一个可能的解决方案,你可以存储日期作为一个字符串在你的模型,而不是作为一个对象。

相关内容

最新更新