參考視頻:黑馬科技:https://www.bilibili.com/video/BV1XW411x7NU?p=19
對話框通常會是一個頂層窗口,出現在程序最上層,用於實現短期任務或者簡潔的用戶交互。
創建功能時,還是選擇QMainwidow,我們自己來實現對話框。

工程所擁有的文件:

下面內容討論的代碼,只會在mainwindow.cpp中存在,所有下面給出的代碼默認就是再mainwindow.cpp中。
先創建一個菜單欄:
1 模態對話框
模態對話框,就是會阻塞同一應用程序中其它窗口的輸入。
測試代碼:
1 //創建工具欄並點擊“模態對話框”觸發一個模態的對話框 2 QToolBar *toolBar = addToolBar("toolBar"); 3 QAction *model_dialog = toolBar->addAction("模態對話框"); 4 connect(model_dialog, &QAction::triggered, 5 [=]() 6 { 7 QDialog dlg; 8 dlg.exec(); //一直在這里執行,直到窗口關閉 9 qDebug() << "model dialog"; 10 } 11 );
運行測試:

只有模態對話框關閉了之后才會打印:"model dialog"。
2 非模態對話框
當操作非模態對話框時,我們也可以對主窗口進行操作。
測試代碼:
1 QAction *modelless_dialog = toolBar->addAction("非模態對話框"); 2 connect(modelless_dialog, &QAction::triggered, 3 [=]() 4 { 5 //這里最好使用動態內存分配,且不要指定父對象,自己回收 6 QDialog *dlg = new QDialog(); 7 dlg->setAttribute(Qt::WA_DeleteOnClose); 8 dlg->show(); 9 qDebug() << "modeless dialog"; 10 } 11 );
運行測試:

顯示非模態對話框時就會打印“modeless dialog”,而不是關閉非模態對話框時打印。
3 消息對話框
QMessageBox用於顯示消息提示。
測試代碼:
1 QAction *message_dialog = toolBar->addAction("消息對話框"); 2 connect(message_dialog, &QAction::triggered, 3 [=]() 4 { 5 //顯示關於 6 QMessageBox::about(this, "about", "關於Qt"); 7 } 8 );
運行測試:

還有一些其它類型的消息對話框,就不在這里說明了。
4 問題對話框
QMessageBox::question用於問題對話框。
測試代碼:
1 QAction *question_dialog = toolBar->addAction("問題對話框"); 2 connect(question_dialog, &QAction::triggered, 3 [=]() 4 { 5 int ret = QMessageBox::question(this, "question", "請選擇", QMessageBox::Yes | QMessageBox::No); 6 switch (ret) { 7 case QMessageBox::Yes: 8 qDebug() << "I am OK!"; 9 break; 10 case QMessageBox::No: 11 qDebug() << "You choose no!"; 12 default: 13 break; 14 } 15 } 16 );
運行測試:

選擇Yes時,會打印:“I am OK!”,選擇No時,會打印:“You choose no!”。
還有一些其它的問題選擇,就不在這里列舉了。
5 文件對話框
QFileDialog,用於實現文件對話框。
測試代碼:
1 QAction *file_dialog = toolBar->addAction("文件對話框"); 2 connect(file_dialog, &QAction::triggered, 3 [=]() 4 { 5 QString path = QFileDialog::getOpenFileName( 6 this, 7 "open", 8 "../", 9 "source(*.cpp *.h);;" 10 "Text(*.txt);;all(*.*)" 11 ); 12 qDebug() << path; 13 } 14 );
運行測試:

當我們選擇一個文件打開之后,會打印出文件的路徑。
說一下QFileDialog::getOpenFileName函數,函數原型:
1 QString getOpenFileName(QWidget * parent = 0, 2 const QString & caption = QString(), 3 const QString & dir = QString(), 4 const QString & filter = QString(), 5 QString * selectedFilter = 0, 6 Options options = 0)
參數時可選的,各個參數的含義如下:
parent:父窗口;
caption:對話框標題;
dir:對話框打開時的默認路徑;
filter:過濾器,用於過濾特定的后綴名,多個過濾器之間使用";;"進行分隔;
selectedFilter:默認選擇的過濾器;
option:對話框的一些參數設定。
完整代碼:
給出mainwindow.cpp文件的完整代碼:
1 #include "mainwindow.h" 2 #include <QMenuBar> 3 #include <QMenu> 4 #include <QDialog> 5 #include <QAction> 6 #include <QToolBar> 7 #include <QDebug> 8 #include <QMessageBox> 9 #include <QFileDialog> 10 11 MainWindow::MainWindow(QWidget *parent) 12 : QMainWindow(parent) 13 { 14 this->resize(600, 500); 15 16 //創建工具欄並點擊“模態對話框”觸發一個模態的對話框 17 QToolBar *toolBar = addToolBar("toolBar"); 18 QAction *model_dialog = toolBar->addAction("模態對話框"); 19 connect(model_dialog, &QAction::triggered, 20 [=]() 21 { 22 QDialog dlg; 23 dlg.exec(); 24 qDebug() << "model dialog"; 25 } 26 ); 27 28 QAction *modelless_dialog = toolBar->addAction("非模態對話框"); 29 connect(modelless_dialog, &QAction::triggered, 30 [=]() 31 { 32 //這里最好使用動態內存分配,且不要指定父對象,自己回收 33 QDialog *dlg = new QDialog(); 34 dlg->setAttribute(Qt::WA_DeleteOnClose); 35 dlg->show(); 36 qDebug() << "modeless dialog"; 37 } 38 ); 39 40 QAction *message_dialog = toolBar->addAction("消息對話框"); 41 connect(message_dialog, &QAction::triggered, 42 [=]() 43 { 44 //顯示關於 45 QMessageBox::about(this, "about", "關於Qt"); 46 } 47 ); 48 49 QAction *question_dialog = toolBar->addAction("問題對話框"); 50 connect(question_dialog, &QAction::triggered, 51 [=]() 52 { 53 int ret = QMessageBox::question(this, "question", "請選擇", QMessageBox::Yes | QMessageBox::No); 54 switch (ret) { 55 case QMessageBox::Yes: 56 qDebug() << "I am OK!"; 57 break; 58 case QMessageBox::No: 59 qDebug() << "You choose no!"; 60 default: 61 break; 62 } 63 } 64 ); 65 66 67 QAction *file_dialog = toolBar->addAction("文件對話框"); 68 connect(file_dialog, &QAction::triggered, 69 [=]() 70 { 71 QString path = QFileDialog::getOpenFileName( 72 this, 73 "open", 74 "../", 75 "source(*.cpp *.h);;" 76 "Text(*.txt);;all(*.*)" 77 ); 78 qDebug() << path; 79 } 80 ); 81 82 } 83 84 MainWindow::~MainWindow() 85 { 86 87 }
