记录一个qt 窗口没有卡死,但是却拖动不了的bug

    技术2022-07-10  164

    今天测试遇到一个奇怪的现象,窗口弹窗后,弹窗和父窗口都不能拖动了,但是窗口里面的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窗口会有边框的明暗变化,可以更快的找到窗口拖动不了的原因,

    Processed: 0.009, SQL: 9