我正在创建一个应用程序,该应用程序通过 QOpenGL * 类与OpenGL进行交互。通过 QOpenGLWidget 显示图形,该图形以UI形式放置。
现在,有一个用于CAD的库(Open CASCADE),该库的OpenGL接口需要渲染窗口的句柄。问题是:我可以以某种方式说出将所有内容呈现到提到的小部件的库吗?
换句话说,是否有一种方法可以将小部件解释为本地的(可能是平台特定的)窗口(此处为HWND),以便该库恰好在该窗口中呈现自己的内容?
谢谢
答案 0 :(得分:0)
经过一番调查,我发现方法 QOpenGLWidget :: winId()返回正确的句柄。直到现在才发现它,因为渲染的场景立即消失了,留下了黑色图片。但是,调整视口大小后,场景会返回(但会再次消失)。据我所知,Open CASCADE似乎在Qt 5 OpenGL实现方面存在问题,因为QGLWidget没有此类问题。
答案 1 :(得分:0)
QOpenGLWidget 与 QGLWidget 不同。
嵌入OCCT 3D查看器的经典方法(您可以在OCCT附带的Qt IESample中找到),创建具有唯一窗口句柄标志的QWidget,采用此窗口句柄并要求OCCT照顾此窗口的OpenGL上下文创建。这是最简单,健壮和可移植的方法,但有一个限制-Qt将无法在此QWidget之上绘制半透明的小部件。这不是OCCT的限制,而是Qt Widgets设计的限制。
QOpenGLWidget 旨在通过允许混合使用自定义OpenGL渲染和普通窗口小部件来解决此限制。但是,外部OpenGL图形引擎的集成变得更加复杂和脆弱。从QOpenGLWidget窃取winId()并不是很有用,因为预计渲染内容不会被绘制到窗口本身中,而是会被绘制到QOpenGLWidget创建的OpenGL framebufer对象(FBO)中-请参见 QOpenGLWidget :: defaultFramebufferObject()< / strong>属性。
为了正确组合Qt小部件,应将外部渲染器渲染到此FBO中。幸运的是,OCCT足够灵活,可以进行这种集成。不幸的是,这种集成需要一些OpenGL知识,以及Qt和OCCT对其的使用。 为此,您需要询问Qt已经创建的OCCT包装OpenGL上下文(为此 V3d_View :: SetWindow()提供类型为 Aspect_RenderingContext 的可选参数,它对应于< Windows上的strong> HGLRC ,可以使用渲染线程中的 wglGetCurrentContext()以及由QOpenGLWidget创建的FBO来获取(为此,OCCT提供了 OpenGl_FrameBuffer :: InitWrapper() 和 OpenGl_Context :: SetDefaultFrameBuffer()方法,以及 OpenGl_Caps :: buffersNoSwap 标志将窗口缓冲区交换管理留给Qt)。
OCCT尚未附带使用 QOpenGLWidget 的示例,但是您也可以找到 qt / AndroidQt 示例,该示例实现了将OCCT 3D Viewer嵌入到的类似操作。 QtQuick 应用程序。