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请及时告知我
╭(●`∀´●)╯╰(●’◡’●)╮
1) 析构中__mess 和 __btn 顺序应该颠倒,否则会crash 2)点击关闭按钮不会有任何信号产生,还不如在__mess.exec()后面返回状态值
1)析构__mess 和 __btn 顺序应该颠倒吧,否则会crash 2)点击关闭按钮不会有任何信号产出,还不如在__mess.exec()后面加个返回值