Qt实现弹窗设置默认选项倒计时自动选择

Qt自带弹窗没有自动倒计时 我自己写了一个


MessageBox.h

#ifndef MESSAGEBOX_H
#define MESSAGEBOX_H

#include <QObject>
#include <QMessageBox>
#include <QTimer>

class MessageBox : public QObject {
    Q_OBJECT
public:
    enum eMessageBox {
        kYes = 0,   // 左边的按钮
        kNo = 1,    // 右边的按钮以及关闭x等等
    };

    MessageBox(QObject *parent = Q_NULLPTR);
    ~MessageBox();

    void Exec(const QMessageBox::Icon icon, const QString &title, const QString &text,
        const QStringList &btn_textlist, const eMessageBox &timer_btn = kYes, const int &timer_s = 0);  
        // 默认倒计时0即不倒计时

private:
    QMessageBox *__mess;    // 弹窗主体
    QList<QPushButton *> __btn; // 按钮们
    QTimer __timer; // 计时器
    int __timer_s;  // 倒计时时间 单位s

signals:
    void Signal_Clicked(const eMessageBox &state);      // 发送按下的按钮

private slots:
    void Slot_Mess_buttonClicked(QAbstractButton *button);
};

#endif  // MESSAGEBOX_H

MessageBox.cpp

#include "MessageBox.h"

MessageBox::MessageBox(QObject *parent)
    : QObject(parent){
}

MessageBox::~MessageBox() {
    if (Q_NULLPTR != __mess) {
        delete __mess;
        __mess = Q_NULLPTR;
    }
    for (auto &i : __btn) {
        if (Q_NULLPTR != i) {
            delete i;
            i = Q_NULLPTR;
        }
    }
}

void MessageBox::Exec(const QMessageBox::Icon icon, const QString &title, const QString &text,
    const QStringList &btn_textlist, const eMessageBox &timer_btn, const int &timer_s) {
    __mess = new QMessageBox(icon, title, text);
    connect(__mess, &QMessageBox::buttonClicked, this, &MessageBox::Slot_Mess_buttonClicked);
    __btn.append(__mess->addButton(btn_textlist[eMessageBox::kYes], QMessageBox::YesRole));
    __btn.append(__mess->addButton(btn_textlist[eMessageBox::kNo], QMessageBox::NoRole));
    __timer_s = timer_s;
    if (__timer_s > 0) {    // 时间大于0 倒计时 否则不倒计时
        connect(&__timer, &QTimer::timeout, this, [=] {
            --__timer_s;
            if (__timer_s <= 0) {
                __mess->buttonClicked(__btn[timer_btn]);    // 时间到 自动按下按钮   计时器在槽里面停止
            }
            __btn[timer_btn]->setText(QStringLiteral("%1(%2)").arg(btn_textlist[timer_btn]).arg(__timer_s));    
            // 刷新按钮上的倒计时
        });
        __timer.start(1000);    // 启动计时器 1s一次
    }
    __mess->exec(); // 显示弹窗
}

void MessageBox::Slot_Mess_buttonClicked(QAbstractButton * button) {
    if (__btn[eMessageBox::kYes] == button) { // 发送按下的按钮
        emit Signal_Clicked(eMessageBox::kYes);
    } else {
        emit Signal_Clicked(eMessageBox::kNo);
    }
    __timer.stop(); // 停掉计时器
    __mess->close();    // 主动关闭窗口
}

由于这是从项目里面摘出来的
变量命名的都有所改变
如有运行错误
或者代码有BUG请及时告知我 
╭(●`∀´●)╯╰(●’◡’●)╮

本文作者:vanxkr

本文链接:http://www.vanxkr.com/2019/6/Qt-MessageBox

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

MFC笔记
2 条评论
  1. author
    2021-07-29 10:36:56
    帅比

    1) 析构中__mess 和 __btn 顺序应该颠倒,否则会crash 2)点击关闭按钮不会有任何信号产生,还不如在__mess.exec()后面返回状态值

  2. author
    2021-07-29 10:35:36
    帅比

    1)析构__mess 和 __btn 顺序应该颠倒吧,否则会crash 2)点击关闭按钮不会有任何信号产出,还不如在__mess.exec()后面加个返回值

已登录,注销 取消