如何从 QQuickFramebufferObject 中访问关联的渲染器对象

How do I access the associated Renderer object from within a QQuickFramebufferObject

我试图在创建时将其存储为成员指针,以便稍后访问:

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
    m_renderer = new MyItemRenderer(this);
    return m_renderer;
}

... 但这不起作用 - Qt 要求 createRenderer 是一个 const 方法,所以我不能在其中分配给 m_renderer。我可以使用 mutable,但这是一种 hack 并且有风险,因为它可能会破坏 Qt 内部的假设。

有什么好的方法吗?

我想到了一个办法:

MyItemRenderer::synchronize 中,将项目的渲染器设置为 this。我不是很喜欢这个,因为这是对synchronize的滥用,但是肯定比mutable.

好多了

这个呢?

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
    return new MyItemRenderer();
}

更多信息here。在本页末尾,声明如下:

However, there is a special case when the FBO has to get recreated regardless: when moving the window to a screen with a different device pixel ratio. For example moving a window between a retina and non-retina screen on OS X systems will inherently need a new, double or half sized, framebuffer, even when the window dimensions are the same in device independent units. Just like with ordinary resizes, Qt is prepared to handle this by requesting a new framebuffer object with a different size when necessary. One possible pitfall here is the applications’ caching of the results of the factory functions: avoid this. createFramebufferObject() and createRenderer() must never cache their return value. Just create a new instance and return it. Keep it simple.