欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT学习(九)——对话框

程序员文章站 2022-05-16 21:00:11
...

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

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

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

模态对话框

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

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

运行:

QT学习(九)——对话框

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

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

非模态对话框

非模态对话框就是,当我打开非模态对话框的时候,在我对非模态对话框操作完成之前,我可以对他的主窗口进行操作,这里主要是使用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();

                   });

运行:

QT学习(九)——对话框

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

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

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

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

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

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

关于对话框

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

                   });

运行:

QT学习(九)——对话框

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

问题对话框

 //问题对话框
    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;
                     }
                   });

运行:

QT学习(九)——对话框

 

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

运行:

QT学习(九)——对话框

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

QT学习(九)——对话框

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

QT学习(九)——对话框

 

 

关于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;
                   });

}

运行:

QT学习(九)——对话框

相关标签: QT