一、概念
1. 對話框是與使用者進行簡短互動的頂層視窗。
2. 其中QDialog是繼承自QWidget的所有對話框的基類。
3. QDialog是一種容器類型的元件。
4. QDialog作為一種專用的互動視窗而存在,是以在設計上應該保證功能單一。
5. 由于QDialog是頂層視窗,是以不能把它嵌入到其他容器裡面。
6. QDialog是定制了視窗式樣的的特殊的QWidget。
7. QDialog和QWidget在樣式上很相像,但是在細節上實作不同,是以将這些細節封裝成一個類後根據實際需要進行不同的開發。
8. 怎麼使用QWidget就可以怎麼使用QDialog。
9. 當QDialog對象作為QWidget對象的父元件時,此時就隻有一個QDialog視窗了,因為當QWidget對象有父元件時它将作為一個可見的部件嵌入到父元件視窗中。
10. QWidget也能建立對話框和頂層視窗,使用QDialog類的意義是軟體複用。
11. QDialog一定是一個頂層視窗(Dialog視窗永遠出現在Widget視窗上面,而不是被嵌套在QWidget中),式樣被定制了。
12. QDialog和QWidget并不相同 ,細節實作上不同。
在不做其他處理的情況下,兩者在樣式上基本一緻。
二、對話框類型
不管是模态對話框還是非模态對話框都需要指定父元件,這樣才能達到作為頂層視窗的效果
(1)模态對話框
1. 模态對話框調用方式:QDialog::exec();
2. 模态對話框顯示後無法與其他視窗進行互動
3. 模态對話框是一種阻塞式的對話框調用方式,阻塞其他視窗的行為的同時也阻塞代碼。
4. 模态對話框用于必須依賴使用者選擇的場合,比如消息提示、字型顔色選擇、列印設定等。
5. 在棧上建立模态對話框是最簡單的方式,因為棧上的代碼在執行完後就會被釋放,剛好和模态對話框的性質吻合。
6. 隻有模态對話框才有傳回值的概念,用于表示互動結果。
7. QDialog::Accepted表示使用者操作成功。
8. QDialog::Recjected表示使用者操作失敗。
9. 通過done(int i)函數用于關閉對話框,同時可以通過參數i設定模态對話框的傳回值。
QDialog dialog(this);//指定父元件為this指針
dialog.exec();
(2)非模态對話框
1. 非模态對話框調用方式:QDialog::show();
2. 非模态對話框顯示後是獨立存在的,此時可以同時與父視窗進行互動。
3. 非模态對話框是一種非阻塞式的對話框調用方式。
4. 非模态對話框用于特殊功能設定的場合,比如屬性設定等。
5. 非模态對話框一般需要在堆上進行建立,因為函數棧執行完就會釋放,在棧上建立的對應的對話框對象也就會被釋放, 由于非模态對話框可以獨立存在,不影響與主視窗的互動,故需要在堆上建立。
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose)
dialog->show();
(3)混合特性對話框
- 通過一套函數既可以設定成模态屬性,也可以設定成非模态。
- 通過Dialog::setModal()函數可以設定混合特性的對話框。
- 非模态對話框需要在函數中指定Qt::WA_DeleteClose 屬性。
- 指定屬性後關閉非模态對話框後就會自動釋放對話框對象在堆空間的指向的記憶體空間
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);//設定屬性,視窗關閉後自動釋放記憶體
//設定具有模态和非模态的屬性,視窗不會發生阻塞,同時具有模态屬性
dialog->setModal(true);
dialog->show();
小結
- 對話框分為模态對話框和非模态對話框。
- 模态對話框是阻塞式的。
- 模态對話框用于依賴使用者操作的場合。
- 非模态對話框是非阻塞的。
- 非模态對話框用于功能設定等場合