如何从QQuickFramebufferObject中访问关联的Renderer对象

时间:2017-06-22 16:21:05

标签: c++ qt qml const qtquick2

我试图将它作为成员指针存储在创建中,因此可以在以后访问它:

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

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

任何正确的方式?

2 个答案:

答案 0 :(得分:0)

我想到了一个方法:

MyItemRenderer::synchronize中,将项目的渲染器设置为this。我不太喜欢这个,因为它滥用synchronize,但肯定比mutable好得多。

答案 1 :(得分:0)

这个怎么样?

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

更多信息here。在本页末尾,陈述如下:

  

但是,有一种特殊情况,必须重新创建FBO,无论如何:将窗口移动到具有不同设备像素比率的屏幕时。例如,在OS X系统上在视网膜和非视网膜屏幕之间移动窗口将固有地需要新的,双倍或半尺寸的帧缓冲,即使窗口尺寸在设备无关单元中是相同的。就像普通的调整大小一样,Qt准备通过在必要时请求具有不同大小的新帧缓冲对象来处理这个问题。这里可能存在的一个缺陷是应用程序缓存了工厂函数的结果:避免这种情况 createFramebufferObject()和createRenderer()必须永远不会缓存其返回值。只需创建一个新实例并将其返回。保持简单。