lee*_*mes 7 opengl qt transparency overlay
我有一个全尺寸的QGLWidget,它使用QPainter绘制应用程序背景(将来可能会更改为原生的openGL命令).
在这个QGLWidget之上,我使用QWidgets(非GL)作为用户界面元素.例如,这些是QLineEdits和QPushButtons.我将它们放入一个使用半透明背景画的自定义绘制的QWidget中.QLineEdit和QPushButton的paintEvents也会被覆盖并使用半透明背景.
整个UI 应该如下所示(这是我禁用OpenGL并使用QWidget而不是QGLWidget作为背景的屏幕截图.请注意半透明的顶部栏也绘制阴影(在其自己的区域内)):
当QLineEdit具有焦点时,它应该具有更高的不透明度但仍然不完全不透明:
现在,在启用OpenGL的情况下(背景是QGLWidget),上面的半透明小部件不会在背景上绘制,而是在(似乎是)未初始化的数据上绘制.通过顶栏发光的图像有时是整个窗口本身,有时其他窗口当前在我的桌面上.
目前看起来如下所示(在此屏幕截图中,绘制半透明绘制操作的数据似乎是窗口小部件本身的图像,具有偏移量.):
当我在行编辑中写入文本时(这里:"这是以前曾经存在的一些文本!"),删除它并将焦点设置回背景小部件(因此放大镜图标和占位符文本出现),以前画的东西仍然闪耀(请注意,可见边框不再可见,但仍然可以透过):
所以问题是:半透明小部件不是被绘制在底层小部件之上,而是绘制在旧结果之上,最初类似于"未初始化的内存".
为什么会这样?我该如何解决这个问题?
回答之前你应该知道的事情:
AbstractMapView
具有一些具体的地图视图类.整个窗口是一个AbstractView
(也有多个具体视图),它包含一个具体的地图视图和覆盖小部件,它们以自己决定的方式组成.因此,我不希望覆盖小部件的逻辑成为底层地图视图的一部分.(我希望你理解这一点,因为它有点复杂.)这听起来像是 GL 内容(即您的背景,又名 QGLWidget)不在 Qt 上下文中的问题。虽然我不是使用 Qt 进行 GL 绘画的专业人士,但您可能想查看有关 GL 绘画和 QLabel 的讨论,以获得一些方向/潜在的提示。
http://www.qtcentre.org/threads/40335-QLabel-on-top-of-a-QGLWidget-background-issue
简而言之,我们在办公室使用 OpenGL 绘画和离屏渲染地图,确保 Qt 能够识别像素非常重要,这样您的前景小部件就可以将半透明应用于其背景。
我们使用的特定产品还以图块的形式渲染地图,并支持在缓冲区中提供 GL 输出(即,它称为快照并以位图形式提供),此时我们使用常规 QWidget 的 PaintEvent 来绘制缓冲区,以便绘制的像素位于 Qt 上下文中。