今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的UI还在继续,也没有死掉,几经排查,发现是以前的弹窗阻塞了父窗口和新弹出来的窗口。
窗口:
窗口A、窗口B是两个没有父子关系的窗口,
子窗口d1和子窗口d2是窗口A的两个子窗口,其中d1调用了
setWindowModality(Qt::WindowModal);
会阻塞窗口A和窗口A的子窗口。
操作:
窗口B中的按钮触发了窗口A弹出子窗口d1的操作,然后不小心点了窗口B的另一个按钮触发了弹出子窗口d2的操作,d2窗口比较大,正好遮住了窗口d1,导致d1因为被遮住而不能拖动,d2因为与d1同为窗口A的子窗口,导致窗口A和d2都被阻塞,于是窗口A和窗口d1、d2基本废了
解决方案:
如果窗口A弹出d1、d2都是在窗口A中触发,如果先弹出d1,那么由于d1的阻塞,就不会弹出d2
如果先弹出d2,那么由于d1是后弹出的,就不会被d2遮住
所以问题出在窗口A触发的环境,在窗口B触发窗口A的弹窗事件的时候,应该提前判断是否有未结束的模态弹窗,如果有的话,提示用户先完成上一次的弹窗操作。
或者,模态对话框置顶,保证其不会被遮住
后话:
如果窗口有边框和标题栏,鼠标操作模态对话框外面的UI的时候,windows窗口会有边框的明暗变化,可以更快的找到窗口拖动不了的原因,