QGLWidget上的透明QGraphicsWebview导致超强的图像

时间:2014-11-05 11:03:59

标签: qt opengl opengl-es qgraphicsview qwebview

我在QGraphicsWebview内有一个透明的QGraphicsView,其中包含以下设置:

  • QGraphicsView是高级窗口小部件,以全屏模式显示
  • 图形视图使用QGLWidget作为其视图端口(使用opengl-es)
    • 此QGLWidget
    • 启用了Alpha通道和双缓冲
  • 透明度由graphicsView->setStyleSheet("background:transparent")
  • 实现
  • 为QGraphicsView和QGraphicsWebview设置以下属性
    • WA_TranslucentBackground = true
    • WA_NoSystemBackground = true
    • WA_OpaquePaintEvent = false
  • 网页浏览的QPalette::BaseQPalette::Window组合以及webview->page()设置为Qt::transparent

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

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

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

Three stages of background transparency

2 个答案:

答案 0 :(得分:1)

我尝试了上面提到的所有方法。他们不适合我。然后我调试到qtbase代码,发现设置不透明度级别使顶层浏览器层透明。

这 - > setOpacity(0.1);

此指针指向QGraphicsWebView对象。

使用此方法,包括背景在内的整个前端浏览器内容将是透明的。要分隔标题,段落和背景并为它们指定不同的透明级别,我将不得不深入研究webkit代码以找出问题。但是现在,setOpacity()完成了这个技巧并且对我正在做的事情已经足够了。

答案 1 :(得分:0)

事实证明问题是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);
}