天天看點

QT模态對話框與非模态對話框以及與MFC對比

一、模态對話框與非模态對話框定義

模态對話框是指在沒有關閉它之前,不能再與同一個應用程式的其他視窗進行互動,比如建立項目時彈出的對話框。

非模态對話框是指既可以和它互動,也可以與同一程式中的其他視窗互動,如word中查找替換對話框。

二、模态對話框與非模态對話框的使用

1、模态對話框

方式一、使用指針堆上建立(需要手動釋放)
QDialog *dlg = new QDialog(this);  //建立對話框對象
dlg->setWindowTitle("模态對話框"); //對話框标題
dlg->resize(200, 200);  //為了避免預設彈框太小,這裡設定下尺寸
dlg->exec();  //顯示對話框
delete dlg;  //因為定制的是臨時對象,是以這裡建議釋放下資源
dlg = nullptr;
方式二、棧上建立,不需要我們釋放
QDialog dlg(this);
dlg.exec();
dlg.resize(200,200);
           

2、非模态對話框

QDialog * dlg2 = new QDialog(this);
 dlg2->resize(200,200);
 dlg2->show();
 dlg2->setAttribute(Qt::WA_DeleteOnClose); //55号屬性,關閉後釋放資源
 qDebug()<<"非模态對話框彈出了";
           

三、對比MFC中的模态對話框與非模态對話框

1、模态對話框

CASCEDlg dlg;
dlg.DoModal();
           

 2、非模态對話框

CASCEDlg *pDlg = new CASCEDlg;
pDlg->Create(IDD_DIALOG1, this);
pDlg->ShowWindow(SW_SHOW);
           

記得在對話框事件中釋放資源

void CTestDlg::OnCancel()
{
    DestroyWindow();
}

void CTestDlg::PostNcDestroy()
{
    CDialog::PostNcDestroy();
    delete this;
}