《QDebug 2024年8月》
一、Qt Widgets 问题交流
1.
二、Qt Quick 问题交流
1.结构体传到QML中未自动释放
测试版本:Qt5.15.2
测试方法:QString/QByteArray等设置100M数据,传到QML中后观察内存增长情况
测试代码:https://github.com/gongjianbo/MyTestCode/tree/master/Qml/TestQml_20240823_Struct
Qt中部分预置类型,如QString/QJsonObject,传到QML中使用后,会在适当的时机自动释放。有两个特列:QImage和Pixmap,这两个类型被定义为稀缺资源(Scarce resource)类型,QML不持有其引用,JS函数中用完就释放了,也不能在QML中用变量保存,甚至。QVector 等容器类型被定义为序列类型,是否自动释放看你内部存储的类型是否能自动释放(测试时发现Qt5.15.2不能用把QVector<QImage>/QList<QImage>放QVariant传递,可以直接传QVector<QImage>,Qt6.7.2用QVector<QImage>传递后内存会增长一个QImage的大小,需要手动gc())。
比较奇怪的是QByteArray,他和QString不一样,直到内存爆了也没有自动释放,需要手动调用gc(),这和我们自定义的类型传到QML中的现象是一样的。而且Qt似乎没有提供相关的设置接口,比如将自定义类型设置为稀缺资源,只能操作完之后手动调用一下gc()。