QGraphicsView可能会在较低的OpenGL模式下调整大小

时间:2017-03-06 12:56:01

标签: qt opengl-es-2.0

我有一个QGraphicsView在应用程序中扮演核心角色,里面有数千个项目。

我将它部署到各种平台,包括PC(Windows和Linux),Android和Raspberry Pi 2.它适用于所有平台,尽管在Raspberry Pi 2上滚动和缩放非常缓慢且滞后。

因此我决定尝试一个OpenGL视口:

QOpenGLWidget *opengl = new QOpenGLWidget;
ui->graphicsView->setViewport(opengl);

(旧的QGLWidget不能在RPi上工作,因为RPi使用仅支持一个本机窗口的EGLFS.QOpenGLWidget使用帧缓冲而不是创建新的本机窗口)

这适用于所有平台,即使在RPi上,滚动和缩放也非常流畅。

然而,有一个问题。每当我调整QGraphicsView的大小时,它都会在临时黑屏上闪烁。我需要调整大小,因为我经常打开侧面板,然后必须收缩QGraphicsView而不是隐藏部分。

我尝试了以下操作,但没有成功:

  • this answer中的设置。

  • 关闭AutoFillBackground

  • 在其QSurfaceFormat中指定depthBufferSize。奇怪的是,它从0开始,我成功地将其设置为24。

  • 我无法更改QSurfaceFormat的swapBehavior。无论我尝试将其设置为0,它都保持为0。奇怪,因为渲染器使用OpenGL-es-2.0,它应该支持双缓冲。尽管如此,视图非常快速且响应迅速,并且与其他图像交换大型像素图也快速而流畅。

  • 在raspi-config中增加分配给GPU的内存大小。

  • 减小QGraphicsView的大小,并大幅减少其中的元素数量(以确保它可以多次适应内存)

  • 尝试setViewportUpdateMode()和setTransformationAnchor()中的所有组合

  • 暂时将QWidget设置为视口,调整大小,然后再将视口设置回QOpenGLWidget。当我将视口从QOpenGLWidget设置为QWidget时会发生闪烁。

  • Kuba Ober的建议:将QGraphicsView放在QOpenGLWidget中。

然而,问题应该在QGraphicsView或其某些设置中,而不是单独在RPi或其图形驱动程序中(这就是我在这里问的原因,而不是在raspberry网站上)。我有以下证据:

  • 如果我创建一个单独的QOpenGLWidget并为其编写一些OpenGL代码,它可以正常工作并调整大小而不会闪烁。如果我更改了hellogl2示例,以便按下按钮时调整QOpenGLWidget的大小,则调整大小没有任何伪影。

  • 有趣的是,如果我将QGraphicsView放入QSplitter并手动移动分割器,则不会发生闪烁。但是,如果我用setSizes()移动分割器,它会闪烁!一个简单的伎俩!如果我手动移动分割器,无论多快和多少,都不会发生闪烁,但视图的高度或宽度属性会发生变化(所以不是因为它只是在屏幕外移动)。当我尝试从软件中移动分割器时,如果它的位置距离我设置的位置只有一个像素,则视图会闪烁。

我的解决方法是在打开侧边栏或调整侧边栏大小时不调整QGraphicsView的大小,侧边栏将覆盖QGraphicsView并更改QGraphicsScene的boundingRect以将可见部分从侧边栏后面推出。我检查了它没有闪烁的工作。但是,我认为这是一个丑陋的黑客攻击,真正的问题仍未得到解决,未来可能会造成其他麻烦。

0 个答案:

没有答案