调整Qt窗口大小时闪烁的白色区域 [英] flickering white areas when resizing Qt window

查看:160
本文介绍了调整Qt窗口大小时闪烁的白色区域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在调整 QWindow 大小时观察到一个奇怪的行为.当我调整窗口大小使宽度和高度都增加或减少时,窗口不会以白色背景闪烁.但是当我增加宽度同时减少高度(反之亦然)时,窗口会闪烁并暂时用白色填充新窗口.这是一个非常烦人的效果,尤其是当我的应用程序中有一个深色主题并调整窗口大小时.

I am observing a strange behavior when resizing QWindow. When I resize the window so that both width and height are increasing or decreasing, then the window does not flicker with white background. But when I increase width while decreasing height (or vice versa) the window flickers and temporarily fill the new are with white color. This is a very annoying effect especially when I have a dark theme in my application and I resize the window.

为了试验这个,我使用了rasterwindow";示例捆绑在 Qt SDK 中.这不使用 QtWidgets 所以我使用了这个例子,以便我排除效果是由小部件引起的.我将 QThread::msleep(100); 添加到 RasterWindow::render(QPainter *) 函数来模拟非常慢的渲染.然后我尝试调整窗口大小.我只能在 Windows 上观察到这一点,但不能在 Linux 或 Mac 上观察到.请参阅随附的 GIF.

To experiment with this I used "rasterwindow" example bundled in Qt SDK. This does not use QtWidgets so I used this example so that I rule out the effect is caused by widgets. I added QThread::msleep(100); to RasterWindow::render(QPainter *) function to simulate a very slow rendering. Then I tried to resize the window. I can observe this only on Windows but not on Linux or Mac. See the attached GIF.

我的问题:

  1. 知道是什么导致了问题吗?为什么只在 Windows 上?
  2. 为什么同时增加宽度和高度时无法观察到?为什么在减少一个维度并增加另一个维度时观察到它?
  3. 如何摆脱它?
  4. 如果我不能完全摆脱它,我可以用白色以外的其他颜色填充新区域吗(这样在黑暗主题中就不会那么烦人了)?

更新:我在这里创建了简约的例子

UPDATE: I created minimalistic example here

/*
This is a minimalistic example to show Qt window flickering on Windows (not observed on Linux nor MacOS).

This is observable ONLY when the window is being resized by dragging lower right (or upper right or lower left) corner
so that one dimension (e.g. width) is increasing and the other dimension (is decreasing).
In that case the newly emerging areas are always filled in with white color which can be observed as terrible flickering.

Curiously the flickering does not happen:
- when you resize the window so that BOTH width and height are increasing
- when you resize the window by dragging the upper left corner

This is not a problem when you have light theme (then window background is probably white anyway).
But this is a big issue when you have dark theme, in which case it is superugly.

Notes:
1) there seems to be the same problem in QtWidgets and QtQuick applications,
   I have not found any Qt application which would behave correctly
2) This is not a problem of Windows OS. Non-Qt applications which I have tested
   seem to behave correctly, i.e. no flickering.
*/

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QThread>

class Widget : public QWidget
{
public:
    Widget()
    {
        /*
        The following code was used for experiments. But nothing worked, I could not get rid of flickering.
        The documentation says:
        autoFillBackground : bool
        This property holds whether the widget background is filled automatically
        If enabled, this property will cause Qt to fill the background of the widget before invoking the paint event.
        The color used is defined by the QPalette::Window color role from the widget's palette.
        */
        //setAttribute(Qt::WA_OpaquePaintEvent, true);
        //setAttribute(Qt::WA_NoSystemBackground, true);
        //setAutoFillBackground(false);
        //QPalette p = palette();
        //p.setColor(QPalette::Window, Qt::blue);
        //setPalette(p);
    }

    void paintEvent(QPaintEvent *) override
    {
        QPainter p(this);
        p.fillRect(0, 0, width(), height(), Qt::blue);
        QThread::msleep(50); // just to simulate slower painting
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

UPDATE2:我怀疑问题可能出在 QWindowsWindow::handleGeometryChange() 中,请参阅 https://code.woboq.org/qt5/qtbase/src/plugins/platforms/windows/qwindowswindow.cpp.html我不知道如何解决它.我将此问题报告为错误 https://bugreports.qt.io/browse/QTBUG-89688

UPDATE2: My suspicion is that the problem might be in QWindowsWindow::handleGeometryChange() see https://code.woboq.org/qt5/qtbase/src/plugins/platforms/windows/qwindowswindow.cpp.html though I do not know how to fix it. I reported this issue as a bug https://bugreports.qt.io/browse/QTBUG-89688

UPDATE3:从 Qt 6.1 开始,该错误似乎已修复.干得好.

UPDATE3: The bug seems to be fixed as of Qt 6.1. Well done.

推荐答案

此错误已在 Qt 6.1 中修复.就我在我的项目中对其进行的测试而言,白色区域的闪烁消失了.

This bug has been fixed in Qt 6.1. As far as I tested it in my projects flickering of the white areas is gone.

这篇关于调整Qt窗口大小时闪烁的白色区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆