12黑马QT笔记之模态对话框、非模态对话框,标准对话框、文件对话框

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();
    });

发布了54 篇原创文章 · 获赞 1 · 访问量 685

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/105712050