Jac*_*ieg 14 qt qml qt-quick qt5 qtquickcontrols
我正在开发一个简单的QML
应用程序,我注意到,与QML
窗口相比,调整大小和移动窗口会产生难看的闪烁QtWidgets
.
所以我创建了2个测试应用程序来显示差异:
QWidgets:
QML:
正如您所看到的那样QML
,应用程序的版本闪烁得非常难看,而QtWidgets
一个版本很干净.当你的用户界面越来越复杂时,现在这变得非常难看.
你对此有什么了解吗?这是一个错误吗?针对此问题是否有任何修复/解决方法?
你可以试试这个:
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 -一个新的开始/
调整 QML 应用程序大小的问题在于更新具有过时几何图形的窗口。修复方法是同步更新和调整大小。
由于从更新计时器到渲染场景图可能会突然更新,这可以随时更新窗口,因此会导致使用过时的几何图形绘制内容。 https://bugreports.qt.io/browse/QTBUG-46074
应使用基本同步或扩展同步来同步调整大小和窗口更新。目前基本同步在 Qt 中使用和实现,但仍然需要将窗口更新(来自计时器)与来自 Windows Manager 的调整大小事件同步。
但是,一如既往,有一系列问题:
当窗口大小调整过快时就会出现此问题。由于同步事件(来自 WM)应该一致地发送,下一个接着上一个:
<= _NET_WM_SYNC_REQUEST是从WM发送的,大小现在正在改变。
_NET_WM_SYNC_REQUEST 由应用程序接收和处理。
<= 收到的一些其他事件,例如新几何图形。
..更新内容,swapBuffers。
=> 将 _NET_WM_SYNC_REQUEST_COUNTER 发送回 WM。
<= _NET_WM_SYNC_REQUEST再次从WM发送,大小正在改变。
.. swapBuffers // 这是问题所在,当窗口改变其几何形状时执行更新。
_NET_WM_SYNC_REQUEST 已收到并再次处理。
因此,当 _NET_WM_SYNC_REQUEST 发送但尚未接收/处理后出现 (7) swapBuffers 时,就会出现问题。
最后得出结论:
换句话说,基本同步或扩展同步都没有帮助(至少在没有 _NET_WM_FRAME_DRAWN 的情况下),因为无法知道实际调整大小何时完成。
扩展同步协议是解决此问题的一种尝试,但由于几何图形的实际更改是在不与客户端同步的情况下完成的,如我所见,如果没有 _NET_WM_FRAME_DRAWN,则始终有机会使用过时的几何图形更新窗口。
https://lists.freedesktop.org/archives/xcb/2019-February/011280.html
归档时间: |
|
查看次数: |
3511 次 |
最近记录: |