【Qt】Qt窗口(六)QMessageBox消息对话框的使用

小编个人主页详情<---请点击
小编个人gitee代码仓库<---请点击
Qt系列专栏<---请点击
倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己!


目录


前言

【Qt】Qt窗口(五)QDialog对话框的使用,点击按钮弹出新的对话框,自定义对话框界面,模态对话框model------书接上文 详情请点击<------,本文会在上文的基础上进行讲解,所以对上文不了解的读者友友请点击前方的蓝字链接进行学习

本文由小编为大家介绍------【Qt】Qt窗口(六)QMessageBox消息对话框的使用


一、QMessageBox

QMessageBox的使用

  1. QMessageBox用于显示一个消息给用户,并且让用户进行一个简单的选择,所以QMessageBox长什么样,又该如何使用呢?所以接下来我们创建一个项目名为QMessageBox,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer
  2. 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

    messageBox->show();

}
  1. 那么在点击按钮发出的clicked信号对应的槽函数中,此时我们期望弹出一个消息对话框,所以此时我们先创建一个QMessageBox对象,然后指定父元素为this指针对应的MainWindow主窗口并且挂接到对象树上,接下来使用setWindowTitle设置消息对话框的窗口标题,使用setText设置消息对话框显示的文本,然后使用setAttribute传参Qt::WA_DeleteOnClose设置消息对话框被关闭的时候自动调用delete进行析构
cpp 复制代码
enum Icon {
    // keep this in sync with QMessageDialogOptions::Icon
    NoIcon = 0,       // 表示没有图标
    Information = 1,  // 表示一个通知
    Warning = 2,      // 表示一个警告
    Critical = 3,     // 表示严重问题
    Question = 4      // 表示一个问题
};
  1. 一般而言消息对话框是要有一个图标的,用于表示当前显示的消息的类别,这里我们使用setIcon的方式给消息对话框设置,那么可以通过我们之前讲解的自定义图标+qrc机制的方式引入自定义图标,但是在这里我们就使用Qt内置提供的图标即可,如上,这里我们就使用QMessageBox::Warning让消息对话框显示的图标是一个警告,接下来我们使用show以非模态的方式显示消息对话框即可

运行结果如下

  1. 此时我们点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,关于这个消息对话框,上面的标题和文本都被我们设置了,同样还有一个警告图标也进行了显示,还有一个默认的按钮OK没有问题,接下来小编点击按钮OK就可以关闭这个消息对话框
  2. 关于这个默认的按钮OK,如果我们没有设置按钮,那么就会显示这个默认的按钮OK,如果我们设置了按钮,那么就会显示我们设置的按钮,就不会显示这个默认的按钮OK了
  3. 同样的,小编继续点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,别忘了这个消息对话框当初是以show的方式以非模态的方式显示的,可是为什么此时我们不能操作消息对话框的父窗口MainWindow呢?
  1. 其实这是由于消息对话框QMessageBox的使用场景更多的是模态的,所以QMessageBox的model属性默认也是true,表示模态的,所以此时我们尽管使用show显示消息对话框,show方法并不会修改对话框的model属性,所以消息对话框QMessageBox是以默认的模态方式显示的,那么为什么之前小编你要讲解show是以非模态的形式显示呢?
  2. 其实这是由于对于QDialog来讲,model属性默认是false,也就是非模态的,以show的方式进行显示,所以是非模态的的方式进行QDialog显示也没有问题
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

//    messageBox->show();
    messageBox->exec();

}
  1. 由于消息对话框QMessageBox的使用场景大多的模态的,尽管show的方式进行显示QMessageBox消息对话框是模态的,但是关于QDialog的理解,我们理解为show是显示非模态的,exec是显示模态的,所以对于模态的显示更规范来讲还是要使用exec进行调用,所以这里我们将show替换为exec,以模态的方式exec调用消息对话框进行显示更为规范

运行结果如下

  1. 小编点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,此时这个消息对话框是通过exec更规范的方式以模态的方式显示的
  2. 所以弹出消息对话框之后,当消息对话框处于弹出状态的时候,代码就会在exec这里阻塞,不能操作消息对话框的父窗口MainWindow,一直到对话框关闭之后,才可以操作消息对话框的父窗口MainWindow,无误
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
//    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

//    messageBox->show();
    messageBox->exec();

    delete messageBox;

}
  1. 此时我们将setAttribute析构消息对话框的方式注释掉,对于exec模态的方式,我们还有另外一种方式析构消息对话框,首先我们要理解exec模态方式运行的消息对话框QMessageBox,如果用户不关闭消息对话框,那么exec函数的调用就会一直阻塞,不会返回,当用户关闭了消息对话框之后才会返回
  2. 所以对于消息对话框窗口的销毁,我们也可以在exec函数调用返回后使用delete的方式进行消息对话框的销毁,此时会有两个行为,清除自己在对象树的挂接,析构释放自己的资源,所以当初我们将消息对话框挂接到对象树上的操作可以被清除挂接,防止重复析构
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

//    messageBox->show();
    messageBox->exec();

//    delete messageBox;

}
  1. 在exec模态的方式调用对话框的时候,setAttribute和delete的这两种方式都可以析构对话框,但是对于show非模态的方式调用对话框的时候只能使用setAttribute的方式,因为如果是delete的方式,那么在show非模态的形式下调用对话框,由于是非阻塞,所以show会直接返回,进而就会执行delete销毁窗口,所以就会出现窗口一闪而过的情况,所以更综合的,写法统一,对于exec模态和show非模态的方式调用对话框,我们更推荐setAttribute的方式析构对话框
  2. 例如,我们打开一个画图板,然后画了一点东西,接下来点击右上角的❌️关闭按钮,此时就会弹出一个消息对话框,那么存在三个选项,保存,不保存,取消,并且我们也可以看到,在图形化程序上,有些场景中,弹出对话框是必要的,就比如上面的画图板的例子,点击关闭,如果不弹出对话框,那么我们当初画的东西就丢失了,此时对于用户来讲体验感就很不好
  3. 但是此时如果弹出对话框,用户就可以知道,噢噢,原来还没有保存呀,所以此时点击保存,那么就会将我们在画图板的画的东西保存下来,这样用户的体验感也更好,所以一定的弹出对话框,可以增强用户的体验感,所以我们也可以给我们的消息对话框加入这三个按钮
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

    messageBox->setStandardButtons(QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel);


//    messageBox->show();
    messageBox->exec();

//    delete messageBox;

}
  1. 所以此时我们就可以使用setStandardButtons这个接口去给消息对话框内添加标准按钮,这里所谓的标准按钮其实就是Qt提前为了消息对话框内置好的一些按钮
cpp 复制代码
enum StandardButton {
    // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton
    NoButton           = 0x00000000,
    Ok                 = 0x00000400,
    Save               = 0x00000800,  // 保存
    SaveAll            = 0x00001000,
    Open               = 0x00002000,
    Yes                = 0x00004000,
    YesToAll           = 0x00008000,
    No                 = 0x00010000,  // 不保存
    NoToAll            = 0x00020000,
    Abort              = 0x00040000,
    Retry              = 0x00080000,
    Ignore             = 0x00100000,
    Close              = 0x00200000,
    Cancel             = 0x00400000,  // 取消
    Discard            = 0x00800000,
    Help               = 0x01000000,
    Apply              = 0x02000000,
    Reset              = 0x04000000,
    RestoreDefaults    = 0x08000000,

    FirstButton        = Ok,                // internal
    LastButton         = RestoreDefaults,   // internal

    YesAll             = YesToAll,          // obsolete
    NoAll              = NoToAll,           // obsolete

    Default            = 0x00000100,        // obsolete
    Escape             = 0x00000200,        // obsolete
    FlagMask           = 0x00000300,        // obsolete
    ButtonMask         = ~FlagMask          // obsolete
};
  1. 我们从Qt上面的这些内置按钮中,依次选择出保存,不保存,取消这三个标准按钮进行传参即可,也就是给setStandardButtons传参QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel

运行结果如下

  1. 小编点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,此时这个消息对话框上由于我们设置了按钮,所以默认按钮Ok就不会进行显示了,而是在消息对话框上显示我们设置的三个按钮,分别是保存,不保存,取消这三个按钮
  2. 所以此时对于这三个按钮,我们进行点击之后都可以关闭消息对话框,所以我们该如何获悉用户究竟点击的是哪个按钮呢?这里我们稍后就来讲解
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

    QPushButton* button1 = new QPushButton("接受", messageBox);
    messageBox->addButton(button1, QMessageBox::AcceptRole);

    QPushButton* button2 = new QPushButton("拒绝", messageBox);
    messageBox->addButton(button2, QMessageBox::RejectRole);
    // connect连接信号和槽,针对按钮的点击实现一些功能


//    messageBox->setStandardButtons(QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel);


//    messageBox->show();
    int result = messageBox->exec();
    if(result == QMessageBox::AcceptRole)
    {
        qDebug() << "AcceptRole" << '\n';
    }
    else if(result == QMessageBox::RejectRole)
    {
        qDebug() << "RejectRole" << '\n';
    }

//    delete messageBox;

}
  1. 小编,小编,如果我不想使用Qt内置提供的这些标准按钮,而是要向消息对话框中添加我们自己的按钮该如何做呢?所以此时我们创建两个按钮,设置文本为接受和拒绝,然后挂接到对象树上并且指定父元素为QMessageBox消息对话框
  2. 所以此时我们就要将按钮使用addButtons添加到QMessageBox消息对话框中了,对于第一个参数我们传入我们创建的按钮的指针即可,那么对于第二个参数需要传入一个按钮表示的类型,那么我们该如何理解这里的按钮类型呢,我们又该如何进行传参呢?
  3. 如上,这里我们关注红色框圈出来的QMessageBox::AcceptRole接受类型和QMessageBox::RejectRole拒绝类型,也就是表征这个消息对话框上的按钮被点击后,此时对话框就会关闭,那么exec就会返回,并且将用户点击的按钮对应的按钮类型作为返回值进行返回,例如,用户点击了接受按钮,那么就会返回QMessageBox::AcceptRole,用户点击了拒绝按钮,那么就会返回QMessageBox::RejectRole,别忘了这些按钮类型都是整数,也就是上图中的蓝色框Value对应的一列,所以此时我们就可以使用整数进行接受exec的返回值,进而通过if语句进行判断即可
  4. 所以此时我们给接受按钮以及对应的QMessageBox::AcceptRole接受类型使用addButton添加到消息对话框,给拒绝按钮以及对应的QMessageBox::RejectRole拒绝类型使用addButton添加到消息对话框,接下来我们使用整数类型的result接受exec的返回值,然后使用if语句进行判断,如果是QMessageBox::AcceptRole接受类型对应的整数值,那么我们就打印AcceptRole日志,如果是QMessageBox::RejectRole拒绝类型对应的整数值,那么就打印RejectRole日志

运行结果如下

  1. 小编点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,此时这个消息对话框上显示就是接受和拒绝这两个按钮
  2. 那么小编点击接受按钮,此时exec就会返回接受按钮对应的QMessageBox::AcceptRole接受类型对应的整数值,所以此时用于接收exec的整数result就会拿到QMessageBox::AcceptRole接收类型对应的整数值,此时经过if语句的判断就会打印AcceptRole日志,那么类似的,如果小编点击拒绝按钮,打印RejectRole日志也是同样道理
  1. 同样的针对我们自己定义的按钮,然后使用setButton设置进消息对话框中,我们不仅可以通过exec返回值的这种方式获取用户点击了哪个按钮,然后通过if语句判断执行不同的功能,同样的,我们还可以针对用户点击按钮本身发出的clicked信号去关联对应的槽函数,去针对这个按钮执行对应的功能
  2. 但是大多数场景下,我们并不会自己自定义按钮,然后使用setButton设置进消息对话框中,而是通过小编刚刚讲解的使用Qt内置提供的标准按钮的方式,通过setStandardButtons将标准按钮设置进消息对话框中,因为这种方式较为快捷,同时我们也不需要自己创建按钮,同样的对于使用Qt内置按钮的方式,我们该如何获取用户点击了哪个按钮呢?能否通过信号槽的方式呢?
  3. 不能,对于标准按钮来讲,我们根本没有办法和手段进行标准按钮的点击信号clicked和槽函数的连接,因为标准按钮不是我们创建的,标准按钮是Qt中的QMessageBox自己创建的,我们无法获取到标准按钮的对象,所以对于connect的第一个参数也就无法进行传参指定是哪一个标准按钮,所以我们无法通过信号槽的方式获取用户点击了哪个按钮
cpp 复制代码
enum StandardButton {
    // keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton
    NoButton           = 0x00000000,
    Ok                 = 0x00000400,
    Save               = 0x00000800,  // 保存
    SaveAll            = 0x00001000,
    Open               = 0x00002000,
    Yes                = 0x00004000,
    YesToAll           = 0x00008000,
    No                 = 0x00010000,  // 不保存
    NoToAll            = 0x00020000,
    Abort              = 0x00040000,
    Retry              = 0x00080000,
    Ignore             = 0x00100000,
    Close              = 0x00200000,
    Cancel             = 0x00400000,  // 取消
    Discard            = 0x00800000,
    Help               = 0x01000000,
    Apply              = 0x02000000,
    Reset              = 0x04000000,
    RestoreDefaults    = 0x08000000,

    FirstButton        = Ok,                // internal
    LastButton         = RestoreDefaults,   // internal

    YesAll             = YesToAll,          // obsolete
    NoAll              = NoToAll,           // obsolete

    Default            = 0x00000100,        // obsolete
    Escape             = 0x00000200,        // obsolete
    FlagMask           = 0x00000300,        // obsolete
    ButtonMask         = ~FlagMask          // obsolete
};
  1. 那么别忘了exec还有返回值,和我们自定义传入按钮对应的按钮类型一样,这里的标准按钮对应的按钮类型就是当初我们传入给setStandardButtons的按钮类型,所以此时我们就可以直接进行判断,如上针对标准按钮的按钮类型同样是整数值,只不过是16进制的,不过一样,都可以使用整数类型进行接收
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QPushButton>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    QMessageBox* messageBox = new QMessageBox(this);

    messageBox->setWindowTitle("这是对话框的窗口标题");
    messageBox->setText("这是对话框的文本");
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->setIcon(QMessageBox::Warning);

//    QPushButton* button1 = new QPushButton("接受", messageBox);
//    messageBox->addButton(button1, QMessageBox::AcceptRole);

//    QPushButton* button2 = new QPushButton("拒绝", messageBox);
//    messageBox->addButton(button2, QMessageBox::RejectRole);
//    // connect连接信号和槽,针对按钮的点击实现一些功能


    messageBox->setStandardButtons(QMessageBox::Save | QMessageBox::No | QMessageBox::Cancel);


//    messageBox->show();
    int result = messageBox->exec();
    if(result == QMessageBox::Save)
    {
        qDebug() << "Save" << '\n';
    }
    else if(result == QMessageBox::No)
    {
        qDebug() << "No" << '\n';
        
    }
    else if(result == QMessageBox::Cancel)
    {
        qDebug() << "Cancel" << '\n';        
    }
    
    
//    if(result == QMessageBox::AcceptRole)
//    {
//        qDebug() << "AcceptRole" << '\n';
//    }
//    else if(result == QMessageBox::RejectRole)
//    {
//        qDebug() << "RejectRole" << '\n';
//    }

//    delete messageBox;

}
  1. 所以此时我们同样使用result接收exec的返回值,如果result的值等于QMessageBox::Save按钮类型,说明用户此时点击了Save,那么我们就打印Save日志,如果result的值等于QMessageBox::No按钮类型,说明用户此时点击了No,那么我们就打印No日志,如果result的值等于QMessageBox::Cancel,说明用户此时点击了Cancel,那么我们就打印Cancel日志

运行结果如下

  1. 小编点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,此时这个消息对话框上显示就是Save,No,Cancel这三个按钮
  2. 那么小编点击Save按钮,此时exec就会返回Save按钮对应的QMessageBox::Save按钮类型对应的整数值,代表此时用户点击了Save按钮,所以此时用于接收exec的整数result就会拿到QMessageBox::Save按钮类型对应的整数值,此时经过if语句的判断就会打印Save日志
  3. 那么类似的,如果小编点击No按钮,打印No日志,如果小编点击Cancel,打印Cancel日志都是同样道理
  1. 其实我们上述使用Qt内置的标准按钮的方式还是较为麻烦,其实我们还有更简洁的方式,那么就是使用QMessageBox提供的静态函数,所以接下来我们创建一个项目名为QMessageBox_2,基类为QMainWindow,派生类为MainWindow的项目,接下来我们点击ui文件,进入Qt Designer
  2. 所以此时我们拖拽左侧红框内的按钮控件,然后调整成上图界面即可,objectName保持不变,接下来我们右击按钮,然后点击转到槽,接下来我们选择clicked信号,让Qt帮我们生成对应槽函数的声明和定义
cpp 复制代码
enum Icon {
    // keep this in sync with QMessageDialogOptions::Icon
    NoIcon = 0,       // 表示没有图标
    Information = 1,  // 表示一个通知
    Warning = 2,      // 表示一个警告
    Critical = 3,     // 表示严重问题
    Question = 4      // 表示一个问题
};
  1. QMessageBox中根据设置图标的不同,提供了不同的静态成员方法,主要有四个,分别是information通知,warning警告,critical严重,question问题,所以我们只需要学会使用一个静态成员方法,那么剩下的三个也都是相似的用法,接下来我们来看静态成员方法warning
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    int result = QMessageBox::warning(this, "这是消息对话框的标题", "这是消息对话框的文本", QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok)
    {
        qDebug() << "Ok" << '\n';
    }
    else if(result == QMessageBox::No)
    {
        qDebug() << "No" << '\n';
    }
}
  1. 使用这个静态方法warning,那么Qt会自动创建一个QMessageBox对话框对象,接下来我们根据上图的warning的函数声明,依次传入父元素为MainWindow对应的this指针,对话框的标题,对话框的文本,最后就是我们想要给QMessageBox传入的标准按钮,这里我们选择传入标准按钮Ok和No即可,也就是传入QMessageBox::Ok | QMessageBox::No
  2. 这里我们再来观察warning的返回值是一个int类型,其实也就和exec的返回值一致,会返回用户在消息对话框上点击按钮对应的按钮类型,所以此时我们使用整数result进行接收静态方法warning的返回值,接下来进行if判断,如果result的值和QMessageBox::Ok相同,说明用户点击了Ok按钮,此时我们打印日志Ok即可,如果result的值和QMessageBox::No相同,说明用户点击了No按钮,此时我们打印日志No即可

运行结果如下

  1. 小编点击MainWindow主窗口上的按钮,此时就弹出一个消息对话框,这个消息对话框的图标就是一个warning对应的警告图标,此时这个消息对话框上显示就是Ok,No这两个按钮
  2. 那么小编点击Ok按钮,此时exec就会返回Ok按钮对应的QMessageBox::Ok按钮类型对应的整数值,代表此时用户点击了Ok按钮,所以此时用于接收exec的整数result就会拿到QMessageBox::Ok按钮类型对应的整数值,此时经过if语句的判断就会打印Ok日志
  3. 那么类似的,如果小编点击No按钮,打印No日志也是同样道理
cpp 复制代码
enum Icon {
    // keep this in sync with QMessageDialogOptions::Icon
    NoIcon = 0,       // 表示没有图标
    Information = 1,  // 表示一个通知
    Warning = 2,      // 表示一个警告
    Critical = 3,     // 表示严重问题
    Question = 4      // 表示一个问题
};
  1. 小编,小编,对于warning警告图标我们已经知道是什么样子了,那么对于其它三个图标information通知,critical严重,question问题,究竟是什么样子呢,所以此时我们直接修改一下调用的静态函数即可完成平替
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    int result = QMessageBox::information(this, "这是消息对话框的标题", "这是消息对话框的文本", QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok)
    {
        qDebug() << "Ok" << '\n';
    }
    else if(result == QMessageBox::No)
    {
        qDebug() << "No" << '\n';
    }
}
  1. 小编将静态函数修改为information,想要观察一下通知图标是什么样子的

运行结果如下

  1. 这里我们只需要观察information通知图标是什么样子的即可,至于现象说明小编就不再赘述了
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    int result = QMessageBox::critical(this, "这是消息对话框的标题", "这是消息对话框的文本", QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok)
    {
        qDebug() << "Ok" << '\n';
    }
    else if(result == QMessageBox::No)
    {
        qDebug() << "No" << '\n';
    }
}
  1. 小编将静态函数修改为critical,想要观察一下严重图标是什么样子的

运行结果如下

  1. 这里我们只需要观察critical严重图标是什么样子的即可,至于现象说明小编就不再赘述了
cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    int result = QMessageBox::question(this, "这是消息对话框的标题", "这是消息对话框的文本", QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok)
    {
        qDebug() << "Ok" << '\n';
    }
    else if(result == QMessageBox::No)
    {
        qDebug() << "No" << '\n';
    }
}
  1. 小编将静态函数修改为question,想要观察一下问题图标是什么样子的

运行结果如下

  1. 这里我们只需要观察question问题图标是什么样子的即可,至于现象说明小编就不再赘述了
  1. 所以对于实际开发中,如果我们只是想要简单的给用户弹出一个消息对话框,那么我们只需要使用上述这种QMessageBox提供的静态成员函数的方式,根据场景中使用的图标的不同选择好对应图标的静态成员函数,即information通知,warning警告,critical严重,question问题
  2. 接下来进行传参,此时Qt就会为我们自动的创建QMessageBox消息对话框对象,根据我们的传参去设置消息对话框的标题,设置文字,设置我们给定的标准按钮,此时我们使用一个整数接收静态成员函数的返回值进行判断即可
  3. 但是如果我们想要自定义消息对话框QMessageBox中的按钮,此时就需要老老实实的手动进行后面的一系列的操作,即创建QMessageBox消息对话框对象,设置消息对话框的标题,设置消息对话框的文字,我们自己创建按钮并且进行设置按钮的文字属性等,将我们自己创建的按钮通过addButton添加进消息对话框中
  4. 接下来我们还需要通过setAttribute接口传参Qt::WA_DeleteOnClose,让Qt帮我们在用户点击消息对话框的关闭按钮的时候,自动delete释放消息对话框QMessageBox对象,紧接着我们再调用exec,以模态的方式显示消息对话框QMessageBox
  5. 接下来我们可以通过两种方式实现用户点击不同按钮呈现不同的功能,在实际的开发中我们可以灵活的根据不同的场景去选择不同的方式进行实现
    (1)方式一,使用整数接收exec的返回值进行判断,进而去实现用户点击不同按钮呈现不同的功能
    (2)方式二,对于这里我们创建的自定义按钮,我们也可以借助信号槽机制实现用户点击不同按钮呈现不同的功能

总结

以上就是今天的博客内容啦,希望对读者朋友们有帮助

水滴石穿,坚持就是胜利,读者朋友们可以点个关注

点赞收藏加关注,找到小编不迷路!

相关推荐
会编程的土豆1 小时前
由c/c++速通go语言,新手必看
c语言·c++·golang
云泽8081 小时前
二叉树高阶笔试算法题精讲(二):非递归遍历与序列构造全解析
c++·算法·面试
爱看书的小沐2 小时前
【小沐学WebGIS】基于Cesium.JS与jsbsim联动三维飞行仿真(OpenGL、Cesium.js、Three.js)
c++·qt·three.js·opengl·cesium·jsbsim
CDN3602 小时前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
froginwe112 小时前
jQuery 添加元素
开发语言
zh_xuan2 小时前
api测试工具支持代理
c++·libcurl
zhangfeng11332 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
csbysj20202 小时前
解释器模式
开发语言
夜猫逐梦2 小时前
[开发经验] DLL注入中控制台窗口无法关闭的排查与修复
c++·windows·控制台