QML窗口调整大小/移动闪烁

Jac*_*ieg 14 qt qml qt-quick qt5 qtquickcontrols

我正在开发一个简单的QML应用程序,我注意到,与QML窗口相比,调整大小和移动窗口会产生难看的闪烁QtWidgets.

所以我创建了2个测试应用程序来显示差异:

QWidgets:

在此输入图像描述

QML:

在此输入图像描述

正如您所看到的那样QML,应用程序的版本闪烁得非常难看,而QtWidgets一个版本很干净.当你的用户界面越来越复杂时,现在这变得非常难看.

你对此有什么了解吗?这是一个错误吗?针对此问题是否有任何修复/解决方法?

Mig*_*ons 9

你可以试试这个:

int main(int argc, char* argv[]) {
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
or
QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
Run Code Online (Sandbox Code Playgroud)

第一个选项使用 OpenGl2DirecX 角度库(如 Google Chrome)

第二个通过软件使用 OpenGL 模拟...对于小程序来说效果很好,并且与 Windows XP 等旧操作系统 100% 兼容。

注意:您可以尝试使用 Qt 5.7 和新的 Qtquick.Controls 2.0 ...表现更好... https://blog.qt.io/blog/2016/06/10/qt-quick-controls-2-0 -一个新的开始/


val*_*bok 3

调整 QML 应用程序大小的问题在于更新具有过时几何图形的窗口。修复方法是同步更新和调整大小。

由于从更新计时器到渲染场景图可能会突然更新,这可以随时更新窗口,因此会导致使用过时的几何图形绘制内容。 https://bugreports.qt.io/browse/QTBUG-46074

应使用基本同步或扩展同步来同步调整大小和窗口更新。目前基本同步在 Qt 中使用和实现,但仍然需要将窗口更新(来自计时器)与来自 Windows Manager 的调整大小事件同步。

但是,一如既往,有一系列问题:

当窗口大小调整过快时就会出现此问题。由于同步事件(来自 WM)应该一致地发送,下一个接着上一个:

  1. <= _NET_WM_SYNC_REQUEST是从WM发送的,大小现在正在改变。

  2. _NET_WM_SYNC_REQUEST 由应用程序接收和处理。

  3. <= 收到的一些其他事件,例如新几何图形。

  4. ..更新内容,swapBuffers。

  5. => 将 _NET_WM_SYNC_REQUEST_COUNTER 发送回 WM。

  6. <= _NET_WM_SYNC_REQUEST再次从WM发送,大小正在改变。

  7. .. swapBuffers // 这是问题所在,当窗口改变其几何形状时执行更新。

  8. _NET_WM_SYNC_REQUEST 已收到并再次处理。

因此,当 _NET_WM_SYNC_REQUEST 发送但尚未接收/处理后出现 (7) swapBuffers 时,就会出现问题。

最后得出结论:

  • 窗口管理器发送_NET_WM_SYNC_REQUEST 后立即开始实际调整窗口大小。而不是当应用程序收到它时。当发送同步请求但尚未由应用程序处理时,窗口甚至可以在此时更新。这将使用过时的几何图形绘制内容。
  • _NET_WM_FRAME_DRAWN 可以帮助调整大小和更新之间的同步,但窗口管理器也可能不支持(并且猜测不支持)。

换句话说,基本同步或扩展同步都没有帮助(至少在没有 _NET_WM_FRAME_DRAWN 的情况下),因为无法知道实际调整大小何时完成。

扩展同步协议是解决此问题的一种尝试,但由于几何图形的实际更改是在不与客户端同步的情况下完成的,如我所见,如果没有 _NET_WM_FRAME_DRAWN,则始终有机会使用过时的几何图形更新窗口。

https://lists.freedesktop.org/archives/xcb/2019-February/011280.html