對話框介紹 對話框是於用戶進行簡易交互的頂層視窗 QDialog是Qt中所有對話框視窗的父類,是一種容器類型的組件 QDialog繼承於QWidget類,如下圖所示: QWidget和QDialog有什麼不同 QDialog: QDialog是定製了視窗式樣的特殊的QWidget QDialog只能 ...
對話框介紹
- 對話框是於用戶進行簡易交互的頂層視窗
- QDialog是Qt中所有對話框視窗的父類,是一種容器類型的組件
- QDialog繼承於QWidget類,如下圖所示:
QWidget和QDialog有什麼不同
QDialog:
- QDialog是定製了視窗式樣的特殊的QWidget
- QDialog只能作為專用的交互視窗
- QDialog不能作為子部件,嵌入其它容器中
QWidget:
- QWidget如果沒有父組件,則將會成為一個主視窗,
- QWidget如果有父組件,則將成為其父組件的子部件,嵌入到其父組件里
代碼試驗: QWidget和QDialog區別
代碼1:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.resize(300,300); QDialog d(&w); d.resize(150,150); w.show(); d.show(); return a.exec(); }
效果:
可以看到,對話框始終都是作為獨立的交互視窗
代碼2:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w1; w1.resize(300,300); QWidget w2(&w1); w2.resize(150,150); w1.show(); w2.show(); return a.exec(); }
效果:
可以看到只出現了一個視窗,並沒有出現第二個視窗
對話框類型
模態對話框
- 屬於阻塞式調用,指沒有關閉該對話框之前,是無法與其它任何視窗進行交互的
- 用於依賴用戶選擇的場合,比如:選項設置,消息提示,字體設置等
- 在棧上創建模態對話框是最簡單常用的方式
- 使用exec()進入對話框的消息迴圈,從而實現阻塞式調用
實驗代碼:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.resize(300,300);
w.show(); QDialog d(&w); d.resize(150,150); d.exec(); //進入對話框d的消息迴圈,從而實現阻塞式調用 return a.exec(); }
非模態對話框
- 屬於非阻塞調用,指出現該對話框時,也可以與父視窗進行交互
- 用於特殊功能設置的場合,比如:查找操作
- 一般情況下非模態對話框需要在堆上創建,避免自動被摧毀
- 非模態對話框需要通過setAttribute()成員函數指定Qt::WA_DeleteOnClose屬性
- Qt::WA_DeleteOnClose表示:退出視窗後,讓Qt自動摧毀這個對話框
- 使用show()來顯示對話框視窗,從而實現非阻塞調用
實驗代碼:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.resize(300,300); w.show(); QDialog *d = new QDialog(&w); d->setAttribute(Qt::WA_DeleteOnClose); d->resize(150,150); d->show(); return a.exec(); }
混合模態對話框
- 在非模態對話框的基礎上調用QDialog::setModal(true)成員函數實現
實驗代碼:
int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.resize(300,300); w.show(); QDialog *d = new QDialog(&w); d->setAttribute(Qt::WA_DeleteOnClose); d->setModal(true); d->resize(150,150); d->show(); return a.exec(); }
對話框返回值處理
- 只有模態對話框才有返回值概念
- QDialog::exec()的返回值作為交互結果
-使用void QDialog::done ( int r ) 作為交互結果,將r值返回給exec()
-返回值為QDialog::Accepted時,表示用戶操作成功
-返回值為QDialog::Rejected時,表示用戶操作失敗
-也可以自定義返回數值