【原】Qt:模态对话框弹出时,宿主窗口蒙板遮盖的技术思路与分析

Qt:模态对话框弹出时,宿主窗口蒙板遮盖的技术思路与分析

这是一个常见的问题。近些年来,Android等移动端的开发普及,一些优秀的、不优秀的产品思路都被带入到其他终端。蒙板遮盖,在移动端很常见。由于移动端的屏幕较小,一般系统都自动加弹窗后的后方窗口加上半透明的遮罩。而Windows平台,系统原生的实现思路是标题栏高亮+点击后标题栏高亮闪烁,既表现了激活窗口的概念,又不至于影响视觉。

以下给出几种实现思路。

一、表现形式

  1. 标题栏高亮。无边框窗口的话,需要自行实现这样的功能。
  2. 蒙板遮盖。技术实现上,可以用一个widget的蒙板,需要时显示,不需要时隐藏。也可以重载绘制窗口的函数。

二、显示时机

  1. 简单的方法,调用模态弹窗代码,前后加上显示和隐藏蒙板的代码。缺点就是,很多地方得加上。
  2. 全局判断。主要是重载QApplication的virtual bool notify(QObject * pObject, QEvent * pEvent) 函数,从而拦截各窗口事件,同时还不用挂钩子。这个方法是本人原创,在几家公司的项目中都使用到,如果看到类似代码,大概率从本人这边copy的。具体思路,notify中判断QEvent::Show和QEvent::Hide事件,再判断是否顶层窗口、是否主窗口等等。效率上,相对较高,但全局拦截,终究有点挫。
  3. 窗口中重载bool event(QEvent* ev),处理QEvent::WindowBlocked和QEvent::WindowUnblocked即可。目前倾向于这种方案。

电脑上,还是不建议使用蒙板。因为一个弹窗显示和关闭,可能仅仅0.x秒的时间,窗口快速的显示和隐藏,给人的感觉很突兀。

 

转载请注明来源,谢谢。

有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:jishurizhi@outlook.com。


老刀的技术日志 » 【原】Qt:模态对话框弹出时,宿主窗口蒙板遮盖的技术思路与分析

发表评论