参考视频:黑马科技: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 }