1 各种对话框说明:
1)模态对话框:操作模态对话框时,不允许操作其他对话框。(QDialog类实现。)
2)非模态对话框:与模态对话框相反,操作模态对话框时,允许操作其他对话框。(QDialog类实现。)
3)标准对话框:包含多种对话框,例如关于对话框,问题对话框等等,可以自行查看帮助文档。用QMessageBox类头文件实现。在这种对话框下,枚举的值基本用类名加作用域加内容实现。例如QMessageBox::Ok。静态函数的调用也是类名加作用域加函数名。例如QMessageBox::question。
4)文件对话框:用于选择电脑中的文件。用QFileDialog类实现,具体函数是getOpenFileName,具体参数看帮助文档即可,参数太多了。其基本作用有两个:
1)打开文件对话框(默认当前路径在安装目录的bin下) 。
2)返回所选择文件的所在路径。
2 代码实现:
1)模态对话框:
//1 模态对话框
//1)首先创建菜单栏
QMenuBar *pBar=menuBar();
//2)创建菜单
QMenu *pFile=pBar->addMenu("文件");
//3)创建菜单项-即动作
QAction *pMod1=pFile->addAction("模态对话框");
//4)按下动作触发信号 弹出模态对话框
connect(pMod1,&QAction::triggered,
[=]()
{
QDialog dlg;
dlg.exec(); //模态对话框的关键
qDebug()<<"111111"; //并没有打印 只有结束才会打印
});
2)非模态对话框:有四种方法实现,最好用成员变量实现。
//非模态对话框
//1)再添加一个菜单项
QAction *pMod2=pFile->addAction("非模态对话框");
//2)按下动作触发信号 弹出非模态对话框
connect(pMod2,&QAction::triggered,
[=]()
{
/*非模态对话框情况1 --栈的局部变量实现 结果:--瞬间消失 因为dlg被释放了
QDialog dlg;
dlg.show(); //非模态对话框的关键
qDebug()<<"111111"; //打印
*/
/*非模态对话框情况2 --类成员变量实现(推荐) 结果:--不会瞬间消失 因为dlg在程序结束被释放
dlg.show(); //非模态对话框的关键
qDebug()<<"111111"; //打印
*/
/*非模态对话框情况3 --堆的局部变量实现 结果:--不会瞬间消失 但会造成内存叠加 因为当你在程序未结束时连续按连续new new出来的内存就好大
//只有当你关闭窗口程序结束时 父对象被析构这片才能被释放 所以不建议
QDialog *dlg1=new QDialog(this);
dlg1->show();
qDebug()<<"111111"; //打印
*/
//非模态对话框情况4 --利用属性 不需要指定父对象 只要关闭非模态对话框就释放该new出来的内存 不必等到主窗口关闭
QDialog *dlg1=new QDialog;
dlg1->setAttribute(Qt::WA_DeleteOnClose); //打上参数查看帮助文档
dlg1->show();
qDebug()<<"111111"; //打印
});
3)标准对话框:
//3 标准对话框 --返回值为枚举(使用时"类名+::+字符串枚举内容") 包括关于对话框 问题对话框等等可以看帮助文档 --头文件为QMessageBox
//下面给出关于对话框与问题对话框
//1)关于对话框
QAction *pAbout=pFile->addAction("关于对话框");
connect(pAbout,&QAction::triggered,
[=]()
{
QMessageBox::about(this,"关于","Qt Creator"); //参2为左上角主题 参3为正文内容
});
//2)问题对话框
QAction *pQuestion=pFile->addAction("问题对话框");
connect(pQuestion,&QAction::triggered,
[=]()
{
//可以使用返回值(枚举型)判断按下了哪个按钮 --应该是有两个按钮的才行 关于的只有一个没有所以没有返回值-->都要看帮助文档
int ret=QMessageBox::question(this,"question","出现问题,是否返回?"); //参2为左上角主题 参3为正文内容
//question的参4参5可以按照已有枚举自己定义
switch (ret) {
case QMessageBox::Yes: qDebug()<<"按下了Yes"; //枚举使用时可以是类名加内容 可以看回C++第一节的内容
break;
case QMessageBox::No: qDebug()<<"按下了No";
break;
default:
break;
}
});
4)文件对话框:
//4 文件对话框 头文件为QFileDialog
//1)先添加菜单项
QAction *pFiDio=pFile->addAction("文件对话框");
//2)按下动作触发信号 弹出文件对话框
connect(pFiDio,&QAction::triggered,
[=]()
{
//getOpenFileName打开文件对话框(默认当前路径在安装目录的bin下) 并且返回文件所在路径
QString str=QFileDialog::getOpenFileName(this,"打开文件","./","Source *.h *.cpp;;Text *.text;;All *.*");
qDebug()<<str.toUtf8().data();
});