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