記錄乙個qt 視窗沒有卡死,但是卻拖動不了的bug

2021-10-07 15:44:06 字數 672 閱讀 8260

今天測試遇到乙個奇怪的現象,視窗彈窗後,彈窗和父視窗都不能拖動了,但是視窗裡面的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視窗會有邊框的明暗變化,可以更快的找到視窗拖動不了的原因,

一視窗卻換不到另乙個視窗中,不報錯,

一視窗卻換不到另乙個視窗中,不報錯,delphi windows sdk api unit z login inte ce uses windows,messages,sysutils,variants,classes,graphics,controls,forms,dialogs,stdctrls...

愛乙個人,沒有或許,沒有但是,沒有原因,就是愛而已

qq個性簽名 愛乙個人,沒有或許,沒有但是,沒有原因,就是愛而已 不要太在乎乙個人,因為在乎,所以期望 因為期望,所以失望。我的離開,只是想證明一件事 我是認真的 你所知道的不要全說,你所看到的不要全信。你忘記的太他媽乾脆,我執著的太他媽心碎。離開我就別安慰我,要知道每一次縫補也會遭遇穿刺的痛。曾經...

自學QT之自己寫乙個視窗

很多時候我們直接建立工程,然後各種介面什麼的都已經被初始化好了的,不過在有些特殊時候,你或許需要寫乙個自己定義的視窗,那麼接下來我們就來進行操作。程式設計環境qt5 首先新建乙個專案,命名為mywidget,然後選擇下一步,在這裡我們選擇qwidget,然後取消介面的選項。widget.cpp的原始...