QT5 C++項目中實現倒計時自動關閉QMessageBox
- 在Windows下的QT5 C++ qmake項目中,希望實現倒計時自動關閉QMessageBox。
- 以下是基于 Qt5 C++ qmake 項目的完整實現,通過自定義
CountdownMessageBox類(繼承自QMessageBox),實現“倒計時顯示+自動關閉”功能,包含.h頭文件和.cpp源文件,支持自定義倒計時時長、提示文本和按鈕類型。效果見下面圖片。
1. 頭文件:CountdownMessageBox.h
定義自定義對話框類,核心邏輯包括:倒計時定時器、動態更新按鈕文本(顯示剩余時間)、自動關閉觸發。
#ifndef COUNTDOWNMESSAGEBOX_H
#define COUNTDOWNMESSAGEBOX_H
#include <QMessageBox>
#include <QTimer>
#include <QString>
// 繼承 QMessageBox,實現倒計時自動關閉
class CountdownMessageBox : public QMessageBox
{
Q_OBJECT
public:
// 構造函數:支持自定義標題、內容、倒計時秒數、按鈕類型
// 參數說明:
// - title: 對話框標題
// - text: 對話框內容(會自動追加倒計時提示)
// - countdownSec: 倒計時秒數(默認3秒)
// - buttons: 對話框按鈕(默認只有“確定”按鈕)
explicit CountdownMessageBox(const QString& title,
const QString& text,
int countdownSec = 3,
StandardButtons buttons = Ok,
QWidget *parent = nullptr);
// 顯示對話框(重寫 show(),確保倒計時啟動時機正確)
void show() override;
private slots:
// 倒計時定時器觸發的槽函數:更新剩余時間,到0時關閉對話框
void onCountdownTimeout();
private:
QTimer* m_countdownTimer; // 倒計時定時器
int m_remainingSec; // 剩余倒計時秒數
QString m_originalText; // 原始對話框內容(用于拼接倒計時文本)
StandardButton m_defaultBtn;// 默認按鈕(倒計時結束后自動觸發該按鈕的點擊事件)
};
#endif // COUNTDOWNMESSAGEBOX_H
2. 源文件:CountdownMessageBox.cpp
實現定時器初始化、倒計時更新、自動關閉邏輯,兼容 Windows 平臺的對話框行為。
#include "CountdownMessageBox.h"
CountdownMessageBox::CountdownMessageBox(const QString& title,
const QString& text,
int countdownSec,
StandardButtons buttons,
QWidget *parent)
: QMessageBox(parent)
, m_remainingSec(countdownSec) // 初始化倒計時秒數
, m_originalText(text) // 保存原始內容(避免重復拼接)
, m_defaultBtn(standardButton(buttons)) // 獲取默認按鈕(如 Ok)
{
// 1. 初始化對話框基礎屬性(標題、按鈕、圖標等)
setWindowTitle(title);
setStandardButtons(buttons);
setDefaultButton(m_defaultBtn); // 設置默認按鈕(按 Enter 可觸發)
// 2. 初始化倒計時定時器
m_countdownTimer = new QTimer(this);
m_countdownTimer->setInterval(1000); // 定時器間隔:1秒(1000毫秒)
m_countdownTimer->setSingleShot(false); // 非單次觸發(循環計時)
// 3. 連接定時器信號與槽函數(每秒觸發一次倒計時更新)
connect(m_countdownTimer, &QTimer::timeout,
this, &CountdownMessageBox::onCountdownTimeout);
// 4. 初始顯示:拼接原始文本和倒計時提示(如“操作成功,3秒后自動關閉...”)
updateText();
}
// 重寫 show() 函數:顯示對話框時啟動倒計時
void CountdownMessageBox::show()
{
m_countdownTimer->start(); // 啟動定時器
QMessageBox::show(); // 調用父類 show(),顯示對話框
}
// 倒計時定時器槽函數:更新剩余時間,到0時關閉對話框
void CountdownMessageBox::onCountdownTimeout()
{
// 1. 減少剩余秒數
m_remainingSec--;
// 2. 更新對話框文本(顯示最新剩余時間)
updateText();
// 3. 倒計時結束:停止定時器 + 觸發默認按鈕點擊 + 關閉對話框
if (m_remainingSec <= 0)
{
m_countdownTimer->stop(); // 停止定時器
// 模擬點擊默認按鈕(觸發對話框的 accept/reject 邏輯,確保信號正常發射)
clickButton(m_defaultBtn);
// 關閉對話框(若 clickButton 未觸發關閉,手動關閉)
close();
}
}
// 輔助函數:更新對話框文本(拼接原始內容和剩余時間)
void CountdownMessageBox::updateText()
{
// 格式:原始文本 + “(X秒后自動關閉)”
QString newText = QString("%1(%2秒后自動關閉)")
.arg(m_originalText)
.arg(m_remainingSec);
setText(newText);
}
3. 使用示例(main.cpp)
在項目中調用自定義的 CountdownMessageBox,支持不同場景(如成功提示、警告提示)。
#include <QApplication>
#include "CountdownMessageBox.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// 示例1:基礎用法(3秒自動關閉,默認“確定”按鈕)
CountdownMessageBox msg1(
"操作成功", // 標題
"文件已成功保存到 D:\\Temp\\", // 內容
3, // 倒計時3秒
QMessageBox::Ok // 按鈕類型
);
msg1.setIcon(QMessageBox::Information); // 設置圖標(信息圖標)
msg1.exec(); // 模態顯示(也可使用 show() 非模態,根據需求選擇)
// 示例2:自定義倒計時+多按鈕(5秒自動關閉,“確定”+“取消”按鈕)
CountdownMessageBox msg2(
"警告", // 標題
"檢測到未保存的修改,是否放棄?", // 內容
5, // 倒計時5秒
QMessageBox::Ok | QMessageBox::Cancel // 多按鈕
);
msg2.setIcon(QMessageBox::Warning); // 設置圖標(警告圖標)
// 監聽按鈕點擊結果(即使自動關閉,也能獲取默認按鈕的結果)
int result = msg2.exec();
if (result == QMessageBox::Ok)
{
qDebug() << "用戶選擇:放棄修改(或倒計時自動觸發)";
}
else if (result == QMessageBox::Cancel)
{
qDebug() << "用戶選擇:取消操作";
}
return a.exec();
}
4. 項目配置(.pro 文件)
確保 qmake 項目配置正確,僅需依賴 Qt 核心模塊(無需額外第三方庫)。
QT += core gui widgets # 依賴 widgets 模塊(QMessageBox 屬于 widgets)
TARGET = CountdownMsgDemo # 項目名稱
TEMPLATE = app # 應用程序模板
SOURCES += main.cpp # 源文件
CountdownMessageBox.cpp
HEADERS += CountdownMessageBox.h # 頭文件
5. 關鍵特性說明(Windows 平臺適配)
- 定時器穩定性:使用
QTimer而非sleep,避免阻塞 UI 線程,確保對話框可正常交互(用戶可手動點擊按鈕提前關閉)。 - 按鈕事件兼容:倒計時結束時通過
clickButton(m_defaultBtn)模擬按鈕點擊,而非直接close(),確保exec()的返回值(如QMessageBox::Ok)正常,與原生QMessageBox行為一致。 - 文本動態更新:通過
updateText()函數實時刷新倒計時文本,用戶可清晰看到剩余時間。 - 模態/非模態支持:支持
exec()(模態,阻塞后續代碼)和show()(非模態,不阻塞),根據業務場景選擇(如后臺操作提示用非模態,關鍵確認用模態)。
浙公網安備 33010602011771號