[英]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.