Qt|模态窗口如何实现进入页面等待加载数据效果

754 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

我们在使用浏览器加载数据时会发现,很多情况下,都是进入某个页面后进行数据加载,例如,网速较慢时,就会出现等待框,等数据获取完成后会将数据展现出来。

对于非模态的窗口的创建,如下所示:

QMyWidget *widget = new QMyWidget(this);
/*数据的数据传输*/
widget->show();

之前的文章我也有讲述,如何在非模态窗口中如何边加载数据边展示页面,如果想要了解的可以查看这里Qt中实现边加载数据边显示页面

在上述文章中,是重写了QWidget::show()函数,窗口一进行创建则启动定时器,进行数据加载。

那么在模态窗口:QDialog作为父类,也可以这样吗?

是要重写QDialog::exec()函数吗?

如果有这种想法的同学,可以尝试一下哟~

经过试验后会发现,重写exec后还是会照样阻塞,等界面数据彻底加载完成之后才会进行展示。

那么我们该如何实现边加载数据边展示页面的效果呢?

其实QDialog的父类就是QWidget,当窗口被初始化且需要展示时,会走到一个叫做:void showEvent(QShowEvent *event) override;函数中。

无论是QWidget作为父类的窗口还是QDialog作为父类的窗口,都是一样的。

Qt官网上对ShowEvent的解释是这样子的:

showEvent官方说明.png

说明:

QShowEvent类提供在显示小部件时发送的事件

有两种显示事件:由窗口系统引起的显示事件(自发的)和内部显示事件。

自发(QEvent:: Spontaneous())显示事件在窗口系统显示窗口之后发送;它们也会在顶级窗口图标化后重新显示时发送。

内部的show事件是在小部件变得可见之前交付的。

当进入到当前窗口后,窗口内部的所有控件都是属于该窗口的小部件,所以,对于小部件的显示和隐藏我们可以在经过系统的处理后,也就是QDialog::showEvent(event);再进行我们实际的业务处理。

也就如同非模态窗口一样,直接开启了数据加载定时器,让我们在展示页面的同时进行数据加载,等数据处理结束之后,再展示。也就实现了等待效果。

对于模态窗口而言,难点在于使用哪个系统函数(showEvent)进行处理,对于实际的UI逻辑并不是难点。

我是中国好公民st,一名C++程序猿~