我有一个全尺寸的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
(有多个混凝土视图,也是如此),同时包含一个混凝土地图视图和覆盖部件,在某种程度上决定本身组成。 因此,我不希望覆盖部件的逻辑是基础地图视图的一部分。 (我希望你能理解这一点,因为它是一个有点复杂。)