2020-09-01

模态窗口的分类

模态窗口分为两种,模态以及半模态窗口。模态窗口即执行exec函数,在该模式下,该代码行下的代码不会被执行。半模态窗口即setModal(true)然后show,在该模式下,该代码行之后的代码仍然会被执行。
模态窗口的的本质是,在主事件循环中启动了新的一个子事件循环,在这个情况下,所有的用户输入动作只会被子事件循环接收处理,而主事件循环不处理,带来的现象就是只能操作子窗口,子窗口的所有父窗口都无法操作,只有关闭自窗口(子事件循环销毁)才能恢复。

使用模态窗口带来的问题

由于模态窗口阻塞父窗口的性质,可以使用该模式来避免弹出子窗口时仍然可以操作父窗口的问题。但是由于该模式只是阻塞的父窗口的用户操作而不是所有的事件,所以一旦消息、定时器等原因导致父窗口隐藏,子模态窗口是不会随着父窗口隐藏的,这样会出现窗口的显示问题(不同窗口管理器),我遇到的有两种。一种是子模态窗口仍然显示在窗口顶部(这时可以通过关闭模态窗口重新获取主窗口的操作权),另一种是子模态窗口被其他窗口压住,这时便会出现主窗口无法操作、模态窗口又无法关闭(因为不可见)的无解问题。

解决方式

在处理模态窗口遇到该问题时,可以通过实例化一个窗口管理器,这个窗口管理器通过事件过滤器检测父窗口的关闭显示事件,在发现父窗口关闭时,通过findchild函数查出所有的dialog对象,将其隐藏,这个问题便不会出现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值