Qt 6.0中QQuickWindow::renderTargetId()的替代方案是什么?
Qt 6 OpenGL模式下获取QQuickWindow内部FBO ID的方案
可用原生API实现方式
Qt 6 虽然移除了QQuickWindow::renderTargetId()接口,但你显式指定使用OpenGL作为渲染后端时,可以通过QSGRendererInterface接口直接获取内部FBO ID:
- 首先绑定
QQuickWindow::beforeRendering()或afterRendering()信号,这两个信号触发时Qt Quick的渲染上下文处于激活状态,资源有效 - 在信号回调中执行以下代码:
QSGRendererInterface* renderIface = quickWindow->rendererInterface(); void* res = renderIface->getResource(quickWindow, QSGRendererInterface::RenderTargetResource); GLuint fboId = *static_cast<GLuint*>(res);
- 注意:该调用仅可在Qt Quick渲染线程的渲染回调中执行,主线程其他位置调用会返回无效值或空指针;且只有在你显式指定渲染API为OpenGL的前提下,返回值才可安全转换为GLuint类型使用
适配QQuickWidget场景的注意事项
你使用QQuickWidget嵌入QML场景时,内部的QQuickWindow本身就是离屏渲染模式,因此默认FBO ID不为0,通过上述方法拿到的ID就是你需要绑定的目标渲染FBO,完全符合你的使用需求。
备选方案
如果你的逻辑无法对齐Qt Quick的渲染回调时机,可以在确认当前OpenGL上下文绑定到QQuickWindow对应上下文的前提下,调用glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fboId)直接查询当前绑定的FBO ID,该方案不需要依赖Qt的渲染回调,但需要自己做好上下文状态校验。
内容的提问来源于stack exchange,提问作者Emil Kabirov
相关产品推荐
相关产品推荐

