Qt 界面最大化的使用注意点

在我的这个程序里面需要实现如下功能:
1.界面最大化
2.界面去掉标题栏
3.显示界面
4.显示界面的时候重新设置界面里面控件的大小
代码如下:

1 maxPicShowForm.setWindowState(Qt::WindowMaximized);//界面最大化
2 maxPicShowForm.setWindowFlag(Qt::FramelessWindowHint);//去掉标题栏
3 maxPicShowForm.show();//显示界面
4 maxPicShowForm.maxSizeImg();

maxPicShowForm是我定义的QWidget对象,在这里作为一个窗口界面,
maxSizeImg()函数内容如下:

1 void MaxPicShowForm::maxSizeImg()
2 {
3     ui->ImageGraphic->setGeometry(0,0,this->width(),this->height());
4 }

在运行过程中,我发现界面最大化显示之后,maxSizeImg()里面获取到的窗口宽和高居然不是显示器的宽和高,而是400x500,也就是这个界面的初始大小!!!
后来我在MaxPicShowForm类里面重写了resizeEvent函数,

virtual void resizeEvent(QResizeEvent *event);

然后惊奇地发现程序运行完show();
这行函数之后,居然进了2次resizeEvent()函数,
第一次进去的时候窗口大小为400x500,第二次进去的时候窗口大小就变成1920x1080了,
而我的maxSizeImg();是在第二次resizeEvent之前执行的,所以获取到的窗口大小不对。

后来我思考了一下,想想也对,show()只是发了一个信号给了MaxPicShowForm类,通知他显示窗口,但发了消息之后程序是不会管MaxPicShowForm接到信号之后的操作是否执行完的,而是直接就运行了show()下面一行的代码。

所以正确的操作应该是把maxSizeImg()里面的代码放在resizeEvent()函数里面。
这样就能实现窗口大小变更的同时,里面的控件大小跟着改变。

顺便记录一下获取系统桌面大小的函数:

1 QDesktopWidget* desktopWidget = QApplication::desktop();
2 //得到客户区矩形1920*1030(因为桌面上的任务栏会占用50像素)
3 QRect clientRect = desktopWidget->availableGeometry();
4 //得到应用程序矩形1920*1080
5 QRect applicationRect = desktopWidget->screenGeometry();

对了,再记录一个坑:
如果把

maxPicShowForm.show();

放在

maxPicShowForm.setWindowFlag(Qt::FramelessWindowHint);//去掉标题栏

前面的话,程序开启后,第一次执行完setWindowFlag()之后,会直接触发maxPicShowForm的hideEvent(QHideEvent *event)事件,而第二次执行上述代码的时候,不会触发hideEvent(QHideEvent *event)事件,这样带来的问题就是,程序启动之后,第一次显示maxPicShowForm子窗口永远都没法显示,只有第二次才能正常显示。
所以结论是:
要把show()的代码位置放在setWindowFlag()后面!

原文地址:https://www.cnblogs.com/ybqjymy/p/13862477.html