第一種是在構造函數中
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_showModal, true);
但這種方法已經在Qt4.5中被摒棄了,因爲按照這樣設置,對話框是無法使用觸摸屏輸入法的,只能用按鍵輸入;
第二種是在構造函數中
setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
setWindowModality(Qt::WindowModal);
其中Qt::Dialog這個屬性是要加的,因爲這個屬性會告訴Qt這個窗口是要被當做對話框對待的,從而實現預期的效果。而下面那個函數的參數有3種:
Qt::NonModal :該窗口不是模態,不會阻塞其它界面接受輸入信息;
Qt::WindowModal:該窗口是一個當以層次的模態窗口,會阻塞它的父窗口、祖父窗口和各個兄弟窗口接受輸入信息;
Qt::ApplicationModal:該窗口是應用模態窗口,會阻塞所有窗口接受輸入信息。
用第二種就能夠在彈出來的對話框中接收輸入法信息。
2、設置了模態卻沒有用的原因:
因爲設置模態會的時候,Qt會根據當前窗口的父窗口是哪個,一步步往上找,然後將應該阻塞的全部阻塞,故沒有效果的原因是沒有父窗口。
比如在一個QWidget中new一個自定義對話框,該對話框設置爲setWindowModality(Qt::WindowModal),然後將這個QWidget裏面的按鍵clicked()信號和對話框的show()槽函數連接起來,一旦點擊就show對話框。這樣創建完後卻發現窗口不是模態的,原因就是沒有父窗口!首先對話框是不可能用佈局將其管理起來,所以其父窗口是默認0。或許有些人說在new的時候將父窗口的this傳進去了,但是模態窗口的屬性是在對話框創建的時候確定的,可此時父窗口QWidget根本就還沒有完全創建完,因此parent還是0,故設置對話框失效!解決辦法就是自定義一個槽函數,當按鍵按下時纔在槽函數裏面創建對話框,此時QWidget已經創建完成,可以將this傳入,這樣就能夠獲得預想的結果。