QML:如何删除全局QSGTexture对象?

时间:2018-01-24 11:03:06

标签: c++ qt qml qt-quick

我有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对象的最佳和正确方法是什么?

1 个答案:

答案 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;
}