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 任务管理器查看它。另一个问题是这是否被认为是一个问题。我想是的,是的。这闪烁击中我的眼睛
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 任务管理器查看它。另一个问题是这是否被认为是一个问题。我想是的,是的。这闪烁击中我的眼睛