Qt|模态窗口如何实现进入页面等待加载数据效果
我们在使用浏览器加载数据时会发现,很多情况下,都是进入某个页面后进行数据加载,例如,网速较慢时,就会出现等待框,等数据获取完成后会将数据展现出来。
对于非模态的窗口的创建,如下所示:
之前的文章我也有讲述,如何在非模态窗口中如何边加载数据边展示页面,如果想要了解的可以查看这里Qt中实现边加载数据边显示页面
在上述文章中,是重写了 QWidget::show()函数,窗口一进行创建则启动定时器,进行数据加载。
那么在模态窗口:QDialog 作为父类,也可以这样吗?
是要重写 QDialog::exec()函数吗?
如果有这种想法的同学,可以尝试一下哟~
经过试验后会发现,重写 exec 后还是会照样阻塞,等界面数据彻底加载完成之后才会进行展示。
那么我们该如何实现边加载数据边展示页面的效果呢?
其实 QDialog 的父类就是 QWidget,当窗口被初始化且需要展示时,会走到一个叫做:void showEvent(QShowEvent *event) override;函数中。
无论是 QWidget 作为父类的窗口还是 QDialog 作为父类的窗口,都是一样的。
Qt 官网上对 ShowEvent 的解释是这样子的:
说明:
QShowEvent 类提供在显示小部件时发送的事件
有两种显示事件:由窗口系统引起的显示事件(自发的)和内部显示事件。
自发(QEvent:: Spontaneous())显示事件在窗口系统显示窗口之后发送;它们也会在顶级窗口图标化后重新显示时发送。
内部的 show 事件是在小部件变得可见之前交付的。
当进入到当前窗口后,窗口内部的所有控件都是属于该窗口的小部件,所以,对于小部件的显示和隐藏我们可以在经过系统的处理后,也就是 QDialog::showEvent(event);再进行我们实际的业务处理。
也就如同非模态窗口一样,直接开启了数据加载定时器,让我们在展示页面的同时进行数据加载,等数据处理结束之后,再展示。也就实现了等待效果。
对于模态窗口而言,难点在于使用哪个系统函数(showEvent)进行处理,对于实际的 UI 逻辑并不是难点。
我是中国好公民 st,一名 C++程序媛~
版权声明: 本文为 InfoQ 作者【中国好公民st】的原创文章。
原文链接:【http://xie.infoq.cn/article/9cdb7c3a17c89ef4588862040】。文章转载请联系作者。
评论