文章目錄
- 1 :peach:對話框介紹:peach:
- 2 :peach:對話框的分類:peach:
- 2.1 :apple:模態對話框:apple:
- 2.2 :apple:非模態對話框:apple:
- 2.3 :apple:混合屬性對話框:apple:
- 3 :peach:Qt 內置對話框:peach:
- 3.1 :apple:消息對話框 QMessageBox:apple:
1 🍑對話框介紹🍑
對話框是 GUI 程序中不可或缺的組成部分。?些不適合在主窗?實現的功能組件可以設置在對話框中。對話框通常是?個頂層窗?,出現在程序最上層,?于實現短期任務或者簡潔的??交互。Qt常?的內置對話框有:QFiledialog
(?件對話框)、QColorDialog
(顏?對話框)、QFontDialog
(字體對話框)、QInputDialog
(輸?對話框)和 QMessageBox
(消息框) 。
2 🍑對話框的分類🍑
對話框分為 模態對話框 和 非模態 對話框。
2.1 🍎模態對話框🍎
模態對話框指的是:顯?后?法與?窗?進?交互,是?種阻塞式的對話框。使? QDialog::exec()
函數 調?。模態對話框適?于必須依賴??選擇的場合,?如消息顯?,?件選擇,打印設置等。
代碼示例:
驗證:
此時如果我們在未關閉該對話框的話就不能夠去點擊父窗口相關的控件了。
2.2 🍎非模態對話框🍎
?模態對話框顯?后獨?存在,可以同時與?窗?進?交互,是?種非阻塞式對話框,使?QDialog::show()
函數調?。?模態對話框?般在堆上創建,這是因為如果創建在棧上時,彈出的?模態對話框就會?閃?過。同時還需要設置 Qt:WA_DeleteOnClose
屬性,?的是:當創建多個?模態對話框時(如打開了多個?模態窗?),為了避免內存泄漏要設置此屬性。?模態對話框適?于特殊功能設置的場合,?如查找操作,屬性設置等。
代碼示例:
驗證:
此時在關閉對話框前我們可以還打開很多個對話框。代碼中我們還設置了Qt:WA_DeleteOnClose
屬性來防止內存泄漏,大家此時可能會有疑問,我們不是將對話框加入到了MainWindow的對象樹里面去了嗎?MainWindow銷毀時這些對話框不就會自動銷毀嗎?按道理這樣是沒錯,但是在MainWindow未退出前,如果創建了非常多的對話框,此時可能會造成大量空間浪費,所以使用Qt:WA_DeleteOnClose
屬性后當我們點擊對話框右上角的X
后就會被自動回收。
2.3 🍎混合屬性對話框🍎
混合屬性對話框同時具有模態對話框和?模態對話框的屬性,對話框的?成和銷毀具有?模態對話框屬性,功能上具有模態對話框的屬性。使? QDialog::setModal()
函數 可以創建混合特性的對話框。通常,創建對話框時需要指定對話框的?組件。
代碼示例:
效果就跟模態對話框一致。
3 🍑Qt 內置對話框🍑
Qt 提供了多種可復?的對話框類型,即 Qt 標準對話框。Qt 標準對話框全部繼承于 QDialog
類。常?標準對話框如下:
3.1 🍎消息對話框 QMessageBox🍎
消息對話框是應?程序中最常?的界?元素。消息對話框主要?于為??提?重要信息,強制??進?選擇操作。QMessageBox類 中定義了靜態成員函數,可以直接調?創建不同?格的消息對話框,其中包括:
我這里就只演示Critical風格的消息對話框,其他的也同理:
代碼示例:
結果驗證:
除了使用上面的方式外,QMessageBox中還內置了一些靜態的成員函數:
使用這些函數我們可以更加方便的創建一些簡單的消息對話框,比如上面的代碼我們還可以這樣寫:
QMessageBox::critical(this,"消息對話框","警告、警告!!!",QMessageBox::No,QMessageBox::Close);
同樣的也能夠完成上述的工作。
但是如果我們想要將自定義的按鈕添加到消息對話框里面應該怎么辦呢?我們刻意使用addButton
來進行添加:
結果驗證:
在一些更加復雜的業務處理中我們還可以將該按鈕添加一個槽函數使用connect
連接即可。
那假如我們想要知道用戶點擊的是哪一個按鈕呢?
其實exec
函數(注意show
函數是沒有返回值的)的返回值就可以拿到:
QPushButton* button=new QPushButton(this);button->setText("kill all");message->addButton(button,QMessageBox::AcceptRole);int t=message->exec();if(t == QMessageBox::No)qDebug()<<"No";else if(t == QMessageBox::Yes)qDebug()<<"Yes";elseqDebug()<<"Other";