今天,在做一个新项目时,发现一个诡异的问题。
在软件初次打开的时候,会调用一次resizeEvent(QResizeEvent *sizechangeevent)函数来对主界面控件大小以及位置进行一次调整。
但由于窗口在设计的时候用的一个大小,而在打开软件后需要将其窗口最大化,因此会用到showMaximized()函数。
为了避免重复resizeEvent函数,我将main函数中的w.show;屏蔽。
main函数如下:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
//w.show;
return a.exec();
}
主界面cpp如下:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
resizeflag=true;
this->showMaximized();
}
void MainWindow::resizeEvent(QResizeEvent *sizechangeevent)
{
Q_UNUSED(sizechangeevent);
qDebug()<<resizeflag;
}
在初始化resizeflag时,resizeflag是等于false的。但是奇怪的事情出现了,以上代码运行的结果是两个true。
这就意味着函数
void MainWindow::resizeEvent(QResizeEvent *sizechangeevent)
被调用了两次,而且这两次都是在resizeflag=true;之后调用的。
更诡异的事情在后面:
当我将this->showMaximized();和resizeflag=true;调换位置时,想象的是因为resizeflag=true;在结构函数最后才进行,因此在这之前resizeflag应该一直处于false状态。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->showMaximized();
resizeflag=true;
}
但输出却是这样的:
于是,我在resizeEvent函数中加了句qDebug()<width();输出窗口大小变化时窗口的宽度,输出如下:
为了更好的观察代码执行顺序,我将构造函数代码变更成这样:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
qDebug()<<"1";
this->showMaximized();
qDebug()<<"2";
resizeflag=true;
}
输出如下:
对比代码可以看出,在执行this->showMaximized();时,实际上窗口并没有最大化,而是在当构造函数结束之后才执行的最大化,而this->showMaximized();的位置似乎是执行的this->show;
为了印证这一点,我将代码更改成如下:
qDebug()<<"1";
this->show();
qDebug()<<"2";
resizeflag=true;
this->showMaximized();
输出与上一个输出一样。
我不知道其底层逻辑是怎么操作的,但至此我能推测原因很有可能是this->showMaximized();进行前没有this->show();的话,会首先进行this->show();在构造函数结束后才会再次进行最大化操作。
我将代码更改如下:
qDebug()<<"1";
this->show();
qDebug()<<"2";
resizeflag=true;
这样写就没有像之前那样输出2个true或者false,输出如下:
因此,在涉及到首次进行showMaximized()函数时,为了避免连续调用两次resizeEvent函数,需要先进行一次show();并需要一个flag在show();的时候为false,show();之后变更为true。
这样再调用showMaximized()时,便能很好的调整窗口控件并且避免重复执行。