Qt 界面的模態與非模態設置

1、對QWidget設置模態窗口有兩種方法:
第一種是在構造函數中
       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傳入,這樣就能夠獲得預想的結果。

例如:

 
TimerWidget的構造函數裏寫上:
TimerWidget::TimerWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
this->setWindowModality(Qt::WindowModal);//阻擋父親窗口內其他控件,除非本dialog關閉
}

/**
* @brief 設置清洗  ---槽函數
*/
void ParamWidget::on_setClearBtn_clicked()
{
QWidget* mainForm = Global::getMainForm();
if (m_timerWidget == 0)
{
m_timerWidget = new TimerWidget(mainForm);//父窗口傳進來

}
m_timerWidget->show();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章