Qt模态窗口的使用问题
模态窗口的分类
模态窗口分为两种,模态以及半模态窗口。模态窗口即执行exec函数,在该模式下,该代码行下的代码不会被执行。半模态窗口即setModal(true)然后show,在该模式下,该代码行之后的代码仍然会被执行。
模态窗口的的本质是,在主事件循环中启动了新的一个子事件循环,在这个情况下,所有的用户输入动作只会被子事件循环接收处理,而主事件循环不处理,带来的现象就是只能操作子窗口,子窗口的所有父窗口都无法操作,只有关闭自窗口(子事件循环销毁)才能恢复。
使用模态窗口带来的问题
由于模态窗口阻塞父窗口的性质,可以使用该模式来避免弹出子窗口时仍然可以操作父窗口的问题。但是由于该模式只是阻塞的父窗口的用户操作而不是所有的事件,所以一旦消息、定时器等原因导致父窗口隐藏,子模态窗口是不会随着父窗口隐藏的,这样会出现窗口的显示问题(不同窗口管理器),我遇到的有两种。一种是子模态窗口仍然显示在窗口顶部(这时可以通过关闭模态窗口重新获取主窗口的操作权),另一种是子模态窗口被其他窗口压住,这时便会出现主窗口无法操作、模态窗口又无法关闭(因为不可见)的无解问题。
解决方式
在处理模态窗口遇到该问题时,可以通过实例化一个窗口管理器,这个窗口管理器通过事件过滤器检测父窗口的关闭显示事件,在发现父窗口关闭时,通过findchild函数查出所有的dialog对象,将其隐藏,这个问题便不会出现了