學習目的:
Qt 對話框QDialog 學習。
對話框是與用戶進行簡短交互的頂層窗口
QDailog是Qt中所有對話框的基類
QDailog繼承於QWidget是一種容器類型的組件

—— QDialog作為專用的交互窗口而存在
——QDialog不能作為子部件嵌入其它容器中
——QDialog其實就是定制了窗口樣式的特殊QWidget
實驗:QDialog與QWidget的區別
測試代碼:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QDialog* dai = new QDialog(&w);//將QDialog 組件嵌入QWidget 中 dai->setWindowTitle("this is Dialog"); dai->show(); w.setWindowTitle("this is Widget "); w.show(); w.resize(100,120); dai->resize(100,120); return a.exec(); }
運行結果:
運行上面代碼 將出現兩個對話框,也就證明了 QDialog不能作為子部件嵌入其它容器中。
對話框的類型:
模態對話框(QDialog::exec()) 用在必須依賴用戶選擇的場合,在棧上建立即可
——顯示后無法與父窗體進行交互
——是一種阻塞式的對話框嗲用方式
非模態對話框(Dialog->show()) 用在特殊功能設置的場合,需要在堆上創建,在棧上創建的不能一直顯示出來(需要指定Qt::WA_DeletteOnClose屬性,在結束對話框后刪除掉此對話框所使用的資源)
——顯示后獨立存在可以同時與父窗體進行交互
——是一種非阻塞式的對話框調用方式
注: 可以通過QDialog::setModal函數可以創建混合特性的對話框。以非阻塞方式調用,但是是不可以操作父窗體的。
模態對話框實驗:
1、建立一個Qdialog對象
2、調用對象的exec();進入消息循環
代碼:
void Dialog::ModalBtn_Clicked()
{
qDebug()<<"ModalBtn_Clicked() Begin";
// QDialog* dialog = new QDialog(this);
// dialog->exec();
QDialog Dialog(this);
Dialog.setWindowTitle("Modal Dialog");
Dialog.exec();
qDebug()<<"ModalBtn_Clicked() End";
}
運行結果:

不能繼續操作父窗體。
非模態對話框實驗:
void Dialog::NoremalBtn_Clicked() { qDebug()<<"NoremalBtn_Clicked() Begin"; QDialog* dialog = new QDialog(this); //Dialog dialog = new Dialog(this); dialog->setWindowTitle("Normoal Dialog"); dialog->show(); dialog->setAttribute(Qt::WA_DeleteOnClose);//關閉對話框自動刪除 dialog 對象 qDebug()<<"NoremalBtn_Clicked() End"; }
運行結果:

顯示后獨立存在可以同時與父窗體進行交互,是一種非阻塞式的對話框調用方式。
混合特性的對話框:
void Dialog::MixedBtn_Clicked() { qDebug()<<"MixedBtn_Clicked() Begin"; QDialog* dialog = new QDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose);//關閉對話框自動刪除 dialog 對象 dialog->setModal(true); dialog->show(); qDebug()<<"MixedBtn_Clicked() End"; }
對話框返回值:
——只有模態對話框才有返回值的概念,由於模態對話框是阻塞的。
——模態對話框的返回值用戶表示交互結果
QDialog::exec()的返回值為交互結果
——void Qdialog::done(int i) 關閉對話框將參數作為交互結果
——QDialog::Accepted 用戶操作成功
——Qdialog::Rejected 用戶操作失敗
