QDialog show-在显示之前,窗口区域被涂成白色

问题描述

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

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

如果我使用

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

然后没有白色油漆,但是没有窗口标题

Windows 10. Desktop Qt 5.15.0 MinGW 64位

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

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

解决方法

我尝试了您的代码,发现MainWindow一开始被涂成白色,但是两个对话框都没问题。

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

问题是,在开始绘画时,QPainter需要一些时间来初始化。因此解决方案是在显示窗口之前先进行绘画。

代码:

#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任务管理器来查看它。另一个问题是这是否被认为是一个问题。我想是的,是的。这种忽隐忽现的目光

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...