Qt|使用QDialog視窗呼叫exec時崩潰解決問題

語言: CN / TW / HK

theme: channing-cyan

一起養成寫作習慣!這是我參與「掘金日新計劃 · 4 月更文挑戰」的第7天,點選檢視活動詳情

前兩天新手妹子遇到了一個問題,問道:“姐,我這個視窗在關閉的時候怎麼總是崩潰,也不知道是為什麼?”

新來的小妹妹是個應屆生,使用視窗展示頁面的時候也是磕磕絆絆的,在使用QDialog視窗時,每次呼叫exec()函式後,總是會崩潰。

那麼,是什麼原因會導致我們在呼叫了QDialog::exec()函式後出現錯誤的呢?

解決問題的方法:

使用最笨的方法解決一切不可解決的問題。

1:註釋所有程式碼

在呼叫exec()出錯了,肯定是當前QDialog視窗的問題,我們首先將你寫的所有程式碼,進行註釋,只保留了最初始的視窗框架。視窗中如果有繼承父視窗或者其他操作視窗時,也一併註釋掉,採用系統的QDialog作為父類。

這時候,我們再執行看看會不會崩潰?一般情況下,只是建立一個空視窗是不會導致崩潰的。

QMyDialog dlg(nullptr); dlg.exec(); 以這種方式呼叫,此時exec崩潰的機率是不大的,除非你的響應控制元件問題。

2:響應訊息判斷

接下來,我們就將UI涉及到的響應訊息放開,但並不放開內部的實現邏輯,檢視是不是因為某些控制元件錯誤使用導致的。

如果也是正常關閉,我們將響應訊息中的實際處理放開。

執行檢視下,視窗是否正常關閉。

3:視窗屬性判斷

經過前兩個步驟,我們發現,都是可以正常關閉的,說明不是我們的業務邏輯以及頁面風格引起的,那麼我們再檢視下是否對該視窗設定了哪些特殊的視窗風格。

經過我一步一步引導,發現在QDialog的建構函式中設定了這樣一句話:Qt::WA_DeleteOnClose

對視窗設定了這樣一個屬性,導致視窗在exec()時出現了崩潰問題。

其實,對於剛剛寫Qt程式碼的新手來說,有些屬性的理解並不是很透徹,就使用了,這就會導致我們在介面展示的時候正常執行,但是關閉視窗時,出現了崩潰問題。

到這裡,就已經找到了崩潰原因,對於我們新手除錯來說,最好的方式就是一步一步註釋程式碼,看一看究竟是到了哪裡影響我們崩潰的。

我是中國好公民st,一名C++程式猿~