Qt::WA_TranslucentBackground
最近开发遇见了,混成关闭窗口阻塞后,拖动其他窗口到上方会出现残影的问题,后来通过增加Qt::WA_TranslucentBackground解决此问题,以下是解决问题的原因。
在说明问题前,我们先了解一下混成关闭后,是谁在绘制窗口:
当混成关闭时,窗口的绘制通常是由X11或其他窗口系统(如Wayland)来处理,而不是Qt直接绘制。具体来说:
1. X11窗口管理:
在X11环境中,窗口的内容是由X服务器管理的。X服务器负责处理窗口的显示、重绘和事件分发。Qt只是向X服务器发出绘制请求,X服务器负责最终的绘制。
2. Qt的角色:
Qt在这种情况下提供的是高层的绘制抽象。它通过调用X11的API来请求重绘、移动窗口等操作,但实际的渲染是由X11来完成的。
3. 透明背景的影响:
即便混成关闭,设置 `Qt::WA_TranslucentBackground` 后,Qt会通过调整窗口的绘制请求来优化X11的重绘过程,减少了可能的残影现象。X11会根据这些请求管理窗口的显示。
解决问题原因:
在X11中,当一个窗口被阻塞或移动时,如果没有设置 `Qt::WA_TranslucentBackground` 属性,可能会出现残影,主要是因为窗口的重绘机制和X11的处理方式:
1. 背景绘制:
- 默认情况下,窗口有一个背景填充(通常是窗口的背景色)。当一个窗口被移动或覆盖时,X11可能不会立即更新被遮挡区域的内容。结果是,旧的内容仍然留在屏幕上,形成残影。
2. 重绘请求:
- 没有设置透明背景时,Qt会向X11发出绘制请求,但这些请求可能不会触发对窗口背景的重新绘制,因为X11并不需要“清空”旧的背景内容,只需绘制新内容。因此,旧的窗口内容可能依然可见。
3. 透明窗口的优化:
- 设置 `Qt::WA_TranslucentBackground` 时,Qt改变了绘制请求的方式,使得X11处理窗口时会以透明形式对待。这意味着X11需要重新考虑如何处理重叠区域,确保旧的内容被正确地更新或清除,从而减少残影现象。
4. 窗口系统的行为:
- X11的窗口系统设计在不同条件下的表现可能会有所不同。透明窗口可能会触发特定的优化策略,确保在窗口移动或交互时内容被正确处理。