QT学习(九)——对话框

任然需要以QMainWindows为基类文件项目

为了方便理解,我把dialog.cpp文件的各个部分拆开解读。

----------------------------------------------------------------------

模态对话框

模态对话框就是,当我打开模态对话框的时候,在我对模态对话框操作完成之前,我无法对他的主窗口进行操作,这里主要是使用exec()函数来进行消息循环,在循环结束之前,只能对当前窗口操作。

 //模态对话框
    connect(p1,&QAction::triggered,
                  [=]()
                   {
                       QDialog ui;
                       ui.resize(300,300);
                       ui.setWindowTitle("模态对话框");
                       ui.exec();//程序运行到这里会循环直到关闭,才会打印下面的话
                       qDebug()<<"模态对话框被关闭!!";
                   });

运行:

在我关闭“模态对话框”之前,我无法对主窗口操作。

--------------------------------------------------------------------

非模态对话框

非模态对话框就是,当我打开非模态对话框的时候,在我对非模态对话框操作完成之前,我可以对他的主窗口进行操作,这里主要是使用show()函数来进行对话框的显示,在当前窗口被关闭之前,可以对其他窗口操作。

//非模态对话框
    connect(p2,&QAction::triggered,
                  [=]()
                   {
                       /*ui.resize(300,300);
                       ui.setWindowTitle("非模态对话框");
                       ui.show();
                       qDebug()<<"模态对话框被启用!!";//非模态的对话框一旦被启用就会打印这句话,因为没有消息循环*/

                        //如果不想使用类成员变量使用指针分配空间也是可以的
                        /*QDialog*wo;
                        wo=new QDialog(this);//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
                        wo->resize(300,300);
                        wo->setWindowTitle("非模态对话框");
                        wo->show();*/
                        //这种指针方法不好的地方在于,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用


                        //如果一定要使用指针的话,不要指示父对象
                        QDialog*wo;
                        wo=new QDialog;//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
                        wo->resize(300,300);
                        wo->setWindowTitle("非模态对话框");
                        wo->setAttribute(Qt::WA_DeleteOnClose);//这一句代码可以让对话框在关闭的时候就释放空间
                        wo->show();

                   });

运行:

如图,当我把鼠标放在主窗口上时,主窗口做出了反应。

而且有三种创建非模态对话框的方式:

1.成员变量——十分简单的方式

2.局部指针变量,new开辟空间,并指定主窗口为父窗口——这样会有弊端,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用

3.局部指针变量,new开辟空间,但是不指定主窗口为父窗口——这样做就可以解决第二种方法的弊端,使用  wo->setAttribute(Qt::WA_DeleteOnClose函数,在传参的时候,可以按F1查看文档来传参,这样就可以让对话框在关闭的时候就释放空间。

-------------------------------------------------------------------------------------

关于对话框

//关于对话框
    QAction*lol=menu->addAction("关于对话框");
    connect(lol,&QAction::triggered,
                  [=]()
                   {
                     QMessageBox::about(this,                               //关于对话框的父对象,表示关于对话框显示在父对象的上面
                                        "关于对话框",                        //关于对话框的标题
                                             "这就是关于对话框!!牛逼嗷!"     //关于对话框的内容
                                        );

                   });

运行:

-------------------------------------------------------------------------------------------------

问题对话框

 //问题对话框
    QAction*pdd=menu->addAction("问题对话框");
    connect(pdd,&QAction::triggered,
                  [=]()
                   {
                     int res=QMessageBox::question(this,"问题","你好看吗?"
                                                   ,QMessageBox::Ok|QMessageBox::Ignore);//第四个参数可以自定义的修改问题框的选项
                     switch (res)
                     {
                         /*case QMessageBox::Yes:
                         qDebug()<<"我很好看!!";
                         break;
                         case QMessageBox::No:
                         qDebug()<<"我很丑,但是我很温柔!";
                         break;
                         default:
                         break;*/
                         case QMessageBox::Ok:
                         qDebug()<<"我很好看!!";
                         break;
                         case QMessageBox::Ignore:
                         qDebug()<<"问我这个问题,您配吗?";
                         break;
                         default:
                         break;
                     }
                   });

运行:

 

QMessageBox::question  函数

1.它的第四个参数是可以改变按钮的内容的;

2.该函数返回值是枚举类型,可以使用int类型来获取返回值,从而得知用户所点击的按钮,并作出相应操作。

 

比如我这段代码,如果不更改按钮,那么就是“Yes”和“No”这两个按钮,

但是我把按钮改成了Ok”“Ignore”这两个按钮,根据返回值可以打印不同语句。

-------------------------------------------------------------------------------

文件对话框

//文件对话框
    QAction*file=menu->addAction("文件对话框");
    connect(file,&QAction::triggered,
                  [=]()
                   {
                      //该函数返回的是一个字符串,就是打开文件的路径名称
                       QString path=QFileDialog::getOpenFileName(this,"文件对话框",
                                                    "../",
                                                     "souce(*.cpp *.h);;"
                                                     "Text(*.txt);;"
                                                     "all(*.*)"
                                                                 );//第四个参数是用来筛选文件类型的参数,也可以这样写  "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
                        qDebug()<<path;
                   });

运行:

当我点击进去一个文件夹,此时限制文件类型只能为souce(*.cpp *.h)

解除限制,可以读取全部文件

 

 

关于QFileDialog::getOpenFileName函数,该函数返回的是一个字符串,该字符串是所选取文件的路径。

第三个参数我有点懵逼,第四个参数是是用来筛选文件类型的参数,有代码注释中的两种写法。

 

 

---------------------------------------------------------------------------------------------------------

粘贴dialog.cpp文件中的全部代码:

#include "dialog.h"
#include<QMenu>
#include<QMenuBar>
#include<QAction>
#include<QDialog>//模态与非模态对话框头文件
#include<QDebug>
#include<QMessageBox>//对话弹框头文件
#include<QFileDialog>//文件对话框
Dialog::Dialog(QWidget *parent)
    : QMainWindow(parent)
{
    resize(500,500);
    QMenuBar*mBar=menuBar();
    setMenuBar(mBar);//设定菜单栏
    QMenu*menu=mBar->addMenu("对话框");
    QAction*p1=menu->addAction("模态对话框");

    //模态对话框
    connect(p1,&QAction::triggered,
                  [=]()
                   {
                       QDialog ui;
                       ui.resize(300,300);
                       ui.setWindowTitle("模态对话框");
                       ui.exec();//程序运行到这里会循环直到关闭,才会打印下面的话
                       qDebug()<<"模态对话框被关闭!!";
                   });




    QAction*p2=menu->addAction("非模态对话框");
    //非模态对话框
    connect(p2,&QAction::triggered,
                  [=]()
                   {
                       /*ui.resize(300,300);
                       ui.setWindowTitle("非模态对话框");
                       ui.show();
                       qDebug()<<"模态对话框被启用!!";//非模态的对话框一旦被启用就会打印这句话,因为没有消息循环*/

                        //如果不想使用类成员变量使用指针分配空间也是可以的
                        /*QDialog*wo;
                        wo=new QDialog(this);//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
                        wo->resize(300,300);
                        wo->setWindowTitle("非模态对话框");
                        wo->show();*/
                        //这种指针方法不好的地方在于,非模态的对话框的内存只有在程序运行结束的时候才会释放空间,如果在程序运行的时候多次点击按钮,那么内存会越变越少,不建议使用


                        //如果一定要使用指针的话,不要指示父对象
                        QDialog*wo;
                        wo=new QDialog;//记住!只有指定了父对象才能在程序结束的时候自动回收这一部分的空间
                        wo->resize(300,300);
                        wo->setWindowTitle("非模态对话框");
                        wo->setAttribute(Qt::WA_DeleteOnClose);//这一句代码可以让对话框在关闭的时候就释放空间
                        wo->show();

                   });





    //关于对话框
    QAction*lol=menu->addAction("关于对话框");
    connect(lol,&QAction::triggered,
                  [=]()
                   {
                     QMessageBox::about(this,                               //关于对话框的父对象,表示关于对话框显示在父对象的上面
                                        "关于对话框",                        //关于对话框的标题
                                             "这就是关于对话框!!牛逼嗷!"     //关于对话框的内容
                                        );

                   });

    //问题对话框
    QAction*pdd=menu->addAction("问题对话框");
    connect(pdd,&QAction::triggered,
                  [=]()
                   {
                     int res=QMessageBox::question(this,"问题","你好看吗?"
                                                   ,QMessageBox::Ok|QMessageBox::Ignore);//第四个参数可以自定义的修改问题框的选项
                     switch (res)
                     {
                         /*case QMessageBox::Yes:
                         qDebug()<<"我很好看!!";
                         break;
                         case QMessageBox::No:
                         qDebug()<<"我很丑,但是我很温柔!";
                         break;
                         default:
                         break;*/
                         case QMessageBox::Ok:
                         qDebug()<<"我很好看!!";
                         break;
                         case QMessageBox::Ignore:
                         qDebug()<<"问我这个问题,您配吗?";
                         break;
                         default:
                         break;
                     }
                   });



    //文件对话框
    QAction*file=menu->addAction("文件对话框");
    connect(file,&QAction::triggered,
                  [=]()
                   {
                      //该函数返回的是一个字符串,就是打开文件的路径名称
                       QString path=QFileDialog::getOpenFileName(this,"文件对话框",
                                                    "../",
                                                     "souce(*.cpp *.h);;"
                                                     "Text(*.txt);;"
                                                     "all(*.*)"
                                                                 );//第四个参数是用来筛选文件类型的参数,也可以这样写  "souce(*.cpp *.h);;Text(*.txt);;all(*.*)"
                        qDebug()<<path;
                   });

}

运行:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值