一、概念
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();
小結
- 對話框分爲模態對話框和非模態對話框。
- 模態對話框是阻塞式的。
- 模態對話框用於依賴用戶操作的場合。
- 非模態對話框是非阻塞的。
- 非模態對話框用於功能設置等場合