我正在创建一个应用程序,它通过QOpenGL*类与OpenGL交互。图形是通过QOpenGLWidget显示的,它被放置在UI表单中.
现在,有一个用于CAD目的的库(开口叶栅),它的OpenGL接口需要一个呈现窗口的句柄。问题是:我可以以某种方式说库将所有东西呈现给所提到的小部件吗?
换句话说,是否有一种方法可以将小部件解释为本机(可能是特定于平台的(这里的HWND)窗口),以便库将自己的东西完全呈现在那里?
谢谢
发布于 2020-02-13 11:40:53
QOpenGLWidget与QGLWidget不是一回事。
嵌入OCCT3D查看器的经典方法,您可以在Qt IESample中找到它,并随OCCT一起创建带有唯一窗口句柄标志的QWidget,使用此窗口句柄并要求OCCT负责此窗口的OpenGL上下文创建。这是最简单、健壮和可移植的方式,但有一个限制-- Qt将无法在此QWidget之上绘制半透明的小部件。这不是OCCT的限制,而是Qt小部件设计的限制。
QOpenGLWidget旨在通过允许混合自定义OpenGL呈现和普通小部件来解决这一限制。然而,外部OpenGL图形引擎的集成变得更加复杂和脆弱。从QOpenGLWidget::defaultFramebufferObject()中窃取winId()并不是很有帮助,因为呈现内容预计不会被绘制到窗口本身,而是会被绘制到由QOpenGLWidget创建的OpenGL framebufer对象(FBO)中,参见QOpenGLWidget属性。
外部呈现程序将呈现到此FBO中,以便正确地组合Qt小部件。幸运的是,OCCT足够灵活,允许这种集成。不幸的是,这种集成需要一些OpenGL知识,以及Qt和OCCT对它的使用。为此,您需要询问OCCT包装Qt已经创建的V3d_View::SetWindow()上下文(为此,OCCT提供了一个可选的Aspect_RenderingContext类型参数,该参数对应于Windows上的HGLRC,可以在呈现线程中使用wglGetCurrentContext()获取)以及QOpenGLWidget创建的FBO (为此,OCCT提供OpenGl_FrameBuffer::InitWrapper()和OpenGl_Context::SetDefaultFrameBuffer()方法,以及将窗口缓冲区交换管理留给Qt的OpenGl_Caps::buffersNoSwap标志)。
OCCT还没有提供使用QOpenGLWidget,的示例,但您也可以找到qt/AndroidQt示例,它实现了将OCCT 3D查看器嵌入到QtQuick应用程序中的类似功能。
发布于 2019-04-16 13:32:26
经过一些调查,我发现方法QOpenGLWidget::winId()返回正确的句柄。直到现在才被发现,因为渲染的场景立刻消失了,留下了一张黑色的图片。然而,当视口被调整大小时,场景会返回(但会再次消失)。据我所知,看来Open级联在Qt5 OpenGL实现方面存在问题,因为QGLWidget没有这样的问题。
https://stackoverflow.com/questions/55715000
复制相似问题