8.QT-對話框(模態與非模態)
阿新 • • 發佈:2018-04-23
所有 消息 屬於 分享 數值 oid qdialog HA 繼承
對話框介紹
- 對話框是於用戶進行簡易交互的頂層窗口
- 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(intargc, 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時,表示用戶操作失敗
-也可以自定義返回數值
8.QT-對話框(模態與非模態)