QT如何实现定时关闭消息提示框
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要为大家展示了"QT如何实现定时关闭消息提示框",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"QT如何实现定时关闭消息提示框"这篇文章吧。一、简述
千家信息网最后更新 2026年11月04日QT如何实现定时关闭消息提示框
这篇文章主要为大家展示了"QT如何实现定时关闭消息提示框",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"QT如何实现定时关闭消息提示框"这篇文章吧。
一、简述
使用Qt简单实现提示框可定时自动关闭。
二、效果
三、工程结构
UI界面

四、源文件
NoticeWidget.pro文件
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = NoticeTEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ noticewidget.cpp HEADERS += mainwindow.h \ noticewidget.h FORMS += mainwindow.ui
mainwindow.h文件
#ifndef MAINWINDOW_H#define MAINWINDOW_H #includenamespace Ui {class MainWindow;} class MainWindow : public QMainWindow{ Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_pushButtonShowNotice_clicked(); private: Ui::MainWindow *ui;}; #endif // MAINWINDOW_H
mainwindow.cpp文件
#include "mainwindow.h"#include "ui_mainwindow.h"#include "noticewidget.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); setWindowTitle("定时自动关闭消息提示框"); ui->plainTextEditMsg->setPlainText("定时自动关闭消息提示框测试,简单测试例子");} MainWindow::~MainWindow(){ delete ui;} void MainWindow::on_pushButtonShowNotice_clicked(){ static NoticeWidget noticeWin; noticeWin.Notice(this, ui->plainTextEditMsg->toPlainText(), 3000);}noticewidget.h文件
#ifndef _NoticeWidget_H_#define _NoticeWidget_H_ #include#include //定时器间隔,单位ms#define TIMER_INTERVAL_MS 50 //默认提示时间1s#define NOTICE_DEF_DELAY_CNT (1000/TIMER_INTERVAL_MS) //透明度最大值255,也就是不透明#define TRANSPARENT_MAX_VAL 255 //透明度递减值#define TRANSPARENT_CUT_VAL (TRANSPARENT_MAX_VAL/NOTICE_DEF_DELAY_CNT + 1) //大小比例#define SIZE_SCALE 0.8 //间距调整#define PADDING 4 //样式,字体颜色:白色;圆角;背景色透明度#define STYLE_SHEET "color:white;border-radius:8px;background-color:rgba(80, 80, 80, %1);" class NoticeWidget :public QLabel{ Q_OBJECT public: void Notice(QWidget *parent, const QString &msg, const int delay_ms = 2000); public: explicit NoticeWidget(QWidget *parent = 0); ~NoticeWidget(); private: void SetMesseage(const QString &msg, int delay_ms); void ChangeSize(); public slots: void OnTimerTimeout(); private: QWidget *mParentPtr; QTimer *mTimerPtr; int mTimerCount; int mBaseWidth; //按一行时算的宽度 int mBaseHeight; //一行高度 int mTransparentVal;//透明度0~255,值越小越透明}; #endif // _NoticeWidget_H_
noticewidget.cpp文件
#include "noticewidget.h" NoticeWidget::NoticeWidget(QWidget *parent) : mParentPtr(parent) , mTimerPtr(nullptr) , mTimerCount(NOTICE_DEF_DELAY_CNT) , mBaseWidth(0) , mBaseHeight(0) , mTransparentVal(TRANSPARENT_MAX_VAL) { //文字居中 setAlignment(Qt::AlignCenter); //定时器,定时消失 mTimerPtr = new QTimer(this); connect(mTimerPtr, SIGNAL(timeout()), this, SLOT(OnTimerTimeout()), Qt::UniqueConnection);} NoticeWidget::~NoticeWidget(){ if (mTimerPtr->isActive()) { mTimerPtr->stop(); } deleteLater();} void NoticeWidget::OnTimerTimeout(){ --mTimerCount; if (0 < mTimerCount) { //重新定位(窗口大小和位置可能变化) if (nullptr != mParentPtr) { QPoint pt((mParentPtr->width() - width()) >> 1, (mParentPtr->height() - height()) >> 1); if (pos() != pt) {//父窗口位置变化 ChangeSize(); move(pt); } } //最后1s开始渐变消失 if (mTimerCount <= NOTICE_DEF_DELAY_CNT && 0 < mTransparentVal) { mTransparentVal -= TRANSPARENT_CUT_VAL; if (0 > mTransparentVal) { mTransparentVal = 0; } //控制透明度 setStyleSheet(QString(STYLE_SHEET).arg(mTransparentVal)); } } else {//显示结束 mTimerPtr->stop(); setVisible(false); }} //设置要显示的消息void NoticeWidget::SetMesseage(const QString &msg, int delay_ms){ mParentPtr = parentWidget(); QFontMetrics fontMetrics(font()); mBaseWidth = fontMetrics.width(msg); mBaseHeight = fontMetrics.height() + PADDING; //设置宽高 ChangeSize(); //换行 setWordWrap(true); //设置显示内容 setText(msg); //居中 if (nullptr != mParentPtr) { move((mParentPtr->width() - width()) >> 1, (mParentPtr->height() - height()) >> 1); } setVisible(true);//显示 setStyleSheet(QString(STYLE_SHEET).arg(TRANSPARENT_MAX_VAL));//设置样式,不透明 mTimerCount = delay_ms/TIMER_INTERVAL_MS + 1;//延时计数计算 mTransparentVal = TRANSPARENT_MAX_VAL;} //跟随父窗口大小变化void NoticeWidget::ChangeSize(){ if (nullptr != mParentPtr) { double wd = mParentPtr->width() * SIZE_SCALE;//宽度占父窗口的80% setFixedSize((int)wd, mBaseHeight*(mBaseWidth/wd + 1)); }} //显示消息,可通过设置delay_ms=0来立即关闭显示void NoticeWidget::Notice(QWidget *parent, const QString &msg, const int delay_ms){ if (mTimerPtr->isActive()) { mTimerPtr->stop(); setVisible(false); } //消息为空直接返回 if (msg.isEmpty() || 0 >= delay_ms) { return; } setParent(parent); SetMesseage(msg, delay_ms); mTimerPtr->start(TIMER_INTERVAL_MS);//开始计数}main.cpp文件
#include "mainwindow.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}
以上是"QT如何实现定时关闭消息提示框"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
消息
提示
文件
透明度
内容
篇文章
一行
大小
定时器
宽度
样式
变化
学习
帮助
测试
最大
也就是
位置
例子
单位
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技股互联网
互联网与科技金融数据
互联网科技的
互联网 科技创业
互联网科技公司电话
互联网与未来科技
九亚互联网科技
云电互联网科技
互联网女皇 腾讯科技
互联网科技logo设计
互联网科技咨询
互联网 科技服务平台
湖南诚度互联网科技有限公司
呼和浩特新华互联网科技学院
开一家科技互联网公司需要多少钱
燊美集互联网科技有限公司
广州新华互联网科技学校电竞方面
华夏恒生科技与互联网科技
城市宝互联网科技有限公司
长沙渺峰互联网科技有限公司
互联网科技网
科技互联网项目
成都狮子座互联网科技
中国最先进互联网科技公司
宜昌元轩互联网科技有限公司
燊美集互联网科技有限公司
特约风豹互联网科技为什么扣费
美国互联网科技实力
互联网科技接地气
科技互联网企业在行动