【问题标题】:OpenGL draws over widgets in QtOpenGL 在 Qt 中绘制小​​部件
【发布时间】:2015-09-16 20:21:51
【问题描述】:

我正在开发一个在 Mac 上使用 Cocoa 的 Qt 应用程序,并正在使用 PowerVR SDK 在 Mac 桌面上启用 OpenGL ES 2.0。

我设法让它工作,一切都完美呈现,问题是 当我在那个窗口中创建一个小部件时,OpenGL会在它上面渲染,例如 我正在创建一个 QLabel 并在其上呈现,使标签不可见。

我尝试在渲染单个 OpenGL 帧后调用 QLabel 的 repaint() 方法,但这没有帮助。

有没有人遇到过类似的问题,有什么建议?

谢谢!

【问题讨论】:

  • 同样的问题,在 windows 下也是。 OpenGL 甚至在工具栏上绘图。
  • 我设法让它工作,一切都完美呈现,问题是当我在那个窗口中创建一个小部件时你用什么来创建“那个窗口”?
  • @LukasT 一个扩展QMainWindow的类,基本上就是一个包裹Cocoa的Qt窗口,我把winId()返回的值传给eglCreateWindowSurface
  • @MaxRaskin 好吧,OpenGL 窗口需要 QOpenGLWidget。

标签: c++ qt opengl-es


【解决方案1】:

如果您希望小部件与 OpenGL 内容互操作,则必须使用 QOpenGLWidget。它绘制到屏幕外缓冲区,然后与小部件合成。

或者,您必须自己将标签渲染为纹理,并将纹理应用于四边形。

【讨论】:

  • 我希望我能做到这一点,但我使用 PowerVR 的 OpenGL 驱动程序,它无法与 QOpenGLWidget 互操作,替代方法过于广泛
  • @MaxRaskin “替代方法太贵了” 不是。不可能。你认为这涉及到什么? Qt 在软件中完成所有小部件组合。在最好的情况下,标签在窗口的后备存储上进行不透明绘图。当您将它渲染到QImage 时,您正在做同样的事情 - 请记住,后备存储的绘制设备只是QImage!此外,您只需要在其文本或样式更改时呈现标签。它的成本尽可能低。
  • 我的意思是实施时间成本高,而不是性能成本高,我的意思是是否有更简单的方法来做到这一点
  • 不,但是 label 只是一个私人案例,考虑一个文本框,实现起来并不是那么简单
  • @MaxRaskin 所有这些都具有相同的实现:您将小部件包含在用于输入/焦点/用户交互的事件处理中,并将其渲染到进入四边形的纹理中。可以使用任何小部件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2015-05-26
  • 2010-10-15
相关资源
最近更新 更多