QT如何实现定时关闭消息提示框
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章主要为大家展示了"QT如何实现定时关闭消息提示框",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"QT如何实现定时关闭消息提示框"这篇文章吧。一、简述
千家信息网最后更新 2025年11月14日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安全错误
数据库的锁怎样保障安全
铁锋区五十二中网络安全周活动
初学网络安全语言
云服务器图标
40人大服务器
外包供电局进行服务器运维
软件开发没经验可以吗
服务器 默认端口
软件开发职业情景模拟
豆粒儿网络技术有限公司
我国网络安全立法体系的三个层面
网络安全综合蓝图
网络安全责任总结
达梦数据库6001
皇室战争重置服务器
荔湾网络安全服务价格
数据库scn值
服务器关机后硬盘还在运行
在数据库中怎么建立表
如何去网络安全部门工作
福建无有网络技术
中国网络安全有哪些措施
科技互联网络反垄断法征求意见
网络安全小知识小常识
原神 小米商城 什么服务器
西安弈聪软件开发有限公司
全网服务器有卖吗
自己做vpn服务器合法吗
无锡富洲互联网科技有限公司
湖南网络安全通信管理员
arcgis修复gdb数据库