第四十八天学习记录:工作相关:Qt resizeEvent 的诡异问题

在Qt应用程序中,当使用showMaximized()函数最大化窗口时,可能会意外触发两次resizeEvent。通过设置一个标志变量resizeflag并在适当的位置调整,可以避免这个问题。关键在于先调用show(),然后设置resizeflag为true,最后再执行showMaximized(),确保resizeEvent只在必要的时候执行。
摘要由CSDN通过智能技术生成

今天,在做一个新项目时,发现一个诡异的问题。

在软件初次打开的时候,会调用一次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()时,便能很好的调整窗口控件并且避免重复执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值