>我试图在创建时将其存储为成员指针,以便以后可以访问它:
QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
m_renderer = new MyItemRenderer(this);
return m_renderer;
}
。但这不起作用 - Qt 要求 createRenderer
是一个 const 方法,所以我无法在其中分配给m_renderer。我可以使用mutable
但这是一个黑客并且有风险,因为它可能会破坏Qt内部的假设。
有什么正确的方法吗?
我想到了一个办法:
在MyItemRenderer::synchronize
中,将项目的渲染器设置为 this
。我不太喜欢这个,因为它滥用synchronize
,但它肯定比mutable
好得多。
这个呢?
QQuickFramebufferObject::Renderer* MyItem::createRenderer() const {
return new MyItemRenderer();
}
更多信息在这里。在本页末尾,说明如下:
但是,在特殊情况下,无论如何都必须重新创建FBO:将窗口移动到具有不同设备像素比的屏幕时。例如,在 OS X 系统上,在视网膜和非视网膜屏幕之间移动窗口本身就需要一个新的、双倍或半大小的帧缓冲器,即使窗口尺寸在与设备无关的单元中相同也是如此。就像普通的大小调整一样,Qt准备在必要时通过请求具有不同大小的新帧缓冲对象来处理这个问题。这里一个可能的陷阱是应用程序缓存工厂函数的结果:避免这种情况。createFramebufferObject(( 和 createRenderer(( 绝不能缓存其返回值。只需创建一个新实例并将其返回即可。保持简单。