在QGLWidget来绘图半透明的QWidget:奇怪的结果(Semi-transparent QW

2019-07-30 13:45发布

我有一个全尺寸的QGLWidget来绘图,其绘制使用QPainter应用背景(可能会改变原生OpenGL命令在未来)。

在此QGLWidget来绘图的顶部我使用的用户界面元素QWidgets(非GL)。 这些,例如,QLineEdits和QPushButtons。 我把它们放进画QWidget的自定义它采用半透明的背景画。 的QLineEdit的和QPushButton的paintEvents被覆盖并使用半透明背景,太。

整个UI 看起来应该像下面的 (这是我禁用OpenGL和使用了QWidget代替QGLWidget来绘图为背景的截图,请注意半透明的顶栏也绘制阴影(其自己的区域内)。):

当QLineEdit的具有焦点,它应该有一个更高的透明度,但仍不能完全不透明:

所以,现在,启用了OpenGL的(当时的背景是一个QGLWidget来绘图),半透明的小部件上面不上油漆的背景之上,但是,(好像是)未初始化的数据。 图像通过顶部栏闪亮有时是整个窗口本身,目前正在我的桌面上有时其他窗口。

这个目前看起来如下 (在该屏幕截图,似乎是小部件本身的图像在其上的半透明画操作画上的数据,具有偏移。):

当我写的文本编辑框(这里:“这是一些文本已经去过那儿”),删除,并设置焦点返回到后台部件(这样的放大镜图标和占位符文本显示),先前涂东西还是彪炳(请注意,可见的边框应该是可见的了,但也还是照过):

所以,问题是:与其被画在底层部件之上,半透明窗口小部件涂在结果之上,最初是像“未初始化的内存”。

为什么会出现这种情况? 我怎样才能解决这个问题?

事情你回答之前应该了解:

  • 背景场景是瓦片的组合物,其呈现在屏幕之外。 因此,它可以画非常快,重画背景的叠加的每一个小变化是没有问题的。
  • 最上面一栏是与包含两个小部件的手动绘画和装置(按钮,行编辑)的自定义QWidget的。
  • 这两个部件覆盖的paintEvent,只画出他们自己的(半透明)的背景具有焦点时,不要使用已Qt提供框架。 所以在第二个屏幕的白色边框绘制在我的自定义的paintEvent。
  • 我想要的背景和覆盖部件的组成是单独实现的。 的背景是一个AbstractMapView具有一些具体地图视图的类。 整个窗口是一个AbstractView (有多个混凝土视图,也是如此),同时包含一个混凝土地图视图和覆盖部件,在某种程度上决定本身组成。 因此,我不希望覆盖部件的逻辑是基础地图视图的一部分。 (我希望你能理解这一点,因为它是一个有点复杂。)

Answer 1:

这听起来像一个问题,即GL内容(即你的背景又名QGLWidget来绘图)不是Qt的背景。 虽然我不是GL绘画使用Qt亲,你可能想看看这个讨论关于GL绘画和一些方向/潜在提示的QLabel。

http://www.qtcentre.org/threads/40335-QLabel-on-top-of-a-QGLWidget-background-issue

总之,我们在这里的办公室使用的OpenGL绘画和屏幕外的地图渲染,这是非常重要的,以确保Qt是意识到像素的让你的前景部件都可以应用到他们的背景半透明。

我们还可以使用特定的产品呈现在瓦片地图,并支持在缓冲区提供GL输出(即它调用一个快照,并提供为位图),此时我们用一个普通的QWidget的的paintEvent画的缓冲区,这样绘制的像素都在Qt的背景。



Answer 2:

您可以定义一个Qframe使用Qt ::闪屏标志作为搜索框,并设置其不透明度。 把你的小工具里面,如搜索文本框和现在的位置是在它应该出现在主窗口。 这也将是一个好主意,重新定位它的主窗口被移动或调整大小覆盖其moveEvent。



文章来源: Semi-transparent QWidget over QGLWidget: Strange results