QDialog show() - 在显示之前,window 区域被涂成白色

QDialog show() - before displaying, the window area is painted white

auto*w=new Dialog1();
w->show();

QDialog show() - 在显示之前,window 区域被涂成白色。在快速计算机上您可能不会注意到这一点。如何避免这种情况?

如果我用

auto*w=new Dialog1();
w->setWindowFlags(Qt::FramelessWindowHint); 
w->show();

然后没有白漆,但是没有window表头

Windows 10. 桌面 Qt 5.15.0 MinGW 64 位

Link 到项目 https://drive.google.com/file/d/1vpuon7lIByZzgjJ0nBg8qU1e5SZAX46Z/view

视频 - https://drive.google.com/file/d/1-gs5UrD62f_JIUFYu4zZftSaxCAbV9zr/view?usp=sharing

我试过你的代码,发现 MainWindow 一开始是白色的,但两个对话框都正常。

我将展示如何解决 MainWindow 问题,您可以将它与任何小部件一起使用。

问题是,在第一次绘画时,QPainter 需要一些时间来初始化。所以解决方案是在显示 window 之前执行第一次绘制。

代码:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    MainWindow w;
    w.grab(); // draw to an offscreen buffer
    w.show();

    return a.exec();
}

我解决了这个问题

class Dialog1 : public QDialog
{
    Q_OBJECT
 
public:
    explicit Dialog1(QWidget *parent = nullptr);
    ~Dialog1();
 
private:
    Ui::Dialog1 *ui;
protected:
    bool event(QEvent*e);
};

Dialog1::Dialog1(QWidget *parent) :
    QDialog(parent),ui(new Ui::Dialog1)
{
    ui->setupUi(this);
 
    setWindowFlags(Qt::Window);
    setWindowOpacity(0);
}
 
bool Dialog1::event(QEvent*e)
{
    if(e->type()==QEvent::WindowActivate)
    {
        QTimer::singleShot(0,NULL,[this](){this->setWindowOpacity(1);});
        return true;
    }
    if(e->type()==QEvent::Hide)
    {
        setWindowOpacity(0);
        return true;
    }
    return QDialog::event(e);
}

这不是 Qt 问题,这是 Windows 问题。我查看了我的 WPF 和 Windows Forms 项目,发现它们有这个问题。您也可以通过 运行 Windows 资源管理器或 Windows 任务管理器查看它。另一个问题是这是否被认为是一个问题。我想是的,是的。这闪烁击中我的眼睛