如何从 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.
我试图在创建时将其存储为成员指针,以便稍后访问:
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.