QGLWidget 上的透明 QGraphicsWebview 导致叠加图像

Posted

技术标签:

【中文标题】QGLWidget 上的透明 QGraphicsWebview 导致叠加图像【英文标题】:Transparent QGraphicsWebview over QGLWidget leads to super imposed images 【发布时间】:2014-11-05 11:03:58 【问题描述】:

我在QGraphicsView 中有一个透明的QGraphicsWebview,具有以下设置:

QGraphicsView 是高级小部件,以全屏模式显示 图形视图使用QGLWidget 作为其视图端口(使用opengl-es) 在这个 QGLWidget 中启用了 Alpha 通道和双缓冲 透明度由graphicsView->setStyleSheet("background:transparent") 实现 为 QGraphicsView 和 QGraphicsWebview 设置了以下属性 WA_TranslucentBackground = true WA_NoSystemBackground = true WA_OpaquePaintEvent = 假 webview和webview->page()QPalette::BaseQPalette::Window画笔设置为Qt::transparent

一开始,透明度工作正常。但是随着屏幕的更新(当我滚动时),看起来新的位图混合在现有的位图之上以获得叠加的图片。在大约 5-6 次屏幕更新后,这种混合会导致颜色累积并形成一个不透明的矩形(带有损坏的图像)。以下图片显示了问题的第一、第二和最后阶段。

如何告诉 qt/opengl 停止混合并将新图像绘制到帧缓冲区? 我尝试从覆盖的 Webview::paint 和 GraphicsView::paintEvent 调用fillRect(boundRect(), Qt::transparent);但它除了让更新变慢之外没有用。

我是 Qt 和 OpenGL 的新手,所以我可能会遗漏一些基本的标志或设置。

【问题讨论】:

【参考方案1】:

我尝试了上面提到的所有方法。他们没有为我工作。然后我调试到 qtbase 代码,发现设置 Opacity 级别使顶部浏览器层透明。

this->setOpacity(0.1);

这个指针指向 QGraphicsWebView 对象。

使用此方法,包括背景在内的整个前端浏览器内容将是透明的。为了分离标题、段落和背景并为它们指定不同的透明级别,我将不得不深入研究 webkit 代码以找出问题所在。但就目前而言,setOpacity() 成功了,对于我正在做的事情来说已经足够了。

【讨论】:

【参考方案2】:

原来问题是graphicsView->setStyleSheet("background:transparent");。谁会猜到?!

是的,我认为让透明度起作用的那条线实际上给透明度带来了麻烦。没有该行(或者如果您将其更改为 background:none),应用程序可以正常工作

简而言之,使用 QGLWidget 获得透明 QGraphicsWebview 的步骤:

QGraphicsWebviewQWebpage 和外部QGraphicsView 的基本调色板设置为Qt::transparent scene->setBackgroundBrush(QBrush(Qt::transparent));

您还应该确保将 html 正文背景设置为透明值:

html, body 
  background-color: rgba(127, 127, 0, 0.5);

【讨论】:

以上是关于QGLWidget 上的透明 QGraphicsWebview 导致叠加图像的主要内容,如果未能解决你的问题,请参考以下文章

QGLWidget 拒绝绘制任何东西

Qt 4.6.3 中 QGLWidget 上的 3D 文本

将只有插槽的 QGLWidget 移动到不同的线程

QGLWidget 和快速的离屏渲染

QGLWidget - 发生失真

QGLWidget 最大尺寸