首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >QOpenGLWidget:检索3 3rdparty库的窗口句柄

QOpenGLWidget:检索3 3rdparty库的窗口句柄
EN

Stack Overflow用户
提问于 2019-04-16 19:01:15
回答 2查看 696关注 0票数 0

我正在创建一个应用程序,它通过QOpenGL*类与OpenGL交互。图形是通过QOpenGLWidget显示的,它被放置在UI表单中.

现在,有一个用于CAD目的的库(开口叶栅),它的OpenGL接口需要一个呈现窗口的句柄。问题是:我可以以某种方式说库将所有东西呈现给所提到的小部件吗?

换句话说,是否有一种方法可以将小部件解释为本机(可能是特定于平台的(这里的HWND)窗口),以便库将自己的东西完全呈现在那里?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-02-13 19:40:53

QOpenGLWidgetQGLWidget不是一回事。

嵌入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应用程序中的类似功能。

票数 1
EN

Stack Overflow用户

发布于 2019-04-16 21:32:26

经过一些调查,我发现方法QOpenGLWidget::winId()返回正确的句柄。直到现在才被发现,因为渲染的场景立刻消失了,留下了一张黑色的图片。然而,当视口被调整大小时,场景会返回(但会再次消失)。据我所知,看来Open级联在Qt5 OpenGL实现方面存在问题,因为QGLWidget没有这样的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55715000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档