我有QQuickItem派生类(MyItem),它只绘制一个纹理(QSGTexture)。因为所有MyItem都绘制了相同的纹理,所以我在所有这些纹理之间共享了一个QSGTexture实例。此实例是在首次访问时创建的:
QSGTexture *MyItem::getGlobalTexture()
{
static auto tex = window->createTextureFromImage(QImage{s_textureName});
return tex;
}
一切都很好,但我想以某种方式在app破坏时删除这个纹理。
我的第一个想法是设置一些父级,我选择了一个QQuickWindow,但这是不可能的,因为它们生活在不同的线程上:
window - mainThread, tex - SGRenderThread
另一种方法是在MyApp析构函数中删除它,但此调用也来自 mainThread , SGRenderThread 可能已被删除。
另一个想法是使用QCoreApplication::aboutToQuit
类型的QueuedConnection
信号,因此如果SGRenderThread
仍然存在并且不再绘制任何帧,则删除将发生在buffer = ""
some_str = "aas30dsa20"
for char in some_str:
if not char.isdigit():
buffer += char
print( buffer )
上。 / p>
删除全局QSGTexture对象的最佳和正确方法是什么?
答案 0 :(得分:0)
我来到以下解决方案实际上是问题的第三个想法,它似乎适用于线程和非线程场景图
QSGTexture *MyItem::getGlobalTexture(QQuickWindow *window)
{
static QSGTexture *texture = [window]{
auto tex = window->createTextureFromImage(QImage{s_textureName});
//will delete the texture on the GSthread
QObject::connect(qApp, &QCoreApplication::aboutToQuit, tex, [tex]{ tex->deleteLater(); });
return tex;
}();
return texture;
}