QT如何实现定时关闭消息提示框
发表于:2025-01-28 作者:千家信息网编辑
千家信息网最后更新 2025年01月28日,这篇文章主要为大家展示了"QT如何实现定时关闭消息提示框",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"QT如何实现定时关闭消息提示框"这篇文章吧。一、简述
千家信息网最后更新 2025年01月28日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安全错误
数据库的锁怎样保障安全
电视登录微信服务器失败
上海web前端软件开发费用
软件开发 面试考察
嵌入式软件开发分类
单口相声视频软件开发
业务协同服务器
大学生软件开发找资金
国图自习软件开发
斑马智能网络技术有限公司
北京地区的dns服务器地址
数据通信网络安全方案
两微一端网络安全制度
软件开发应届生要求
漏洞数据库包含什么信息
网络安全主要包括几个方面
成都大运会网络安全检查
互联网科技与文教卫专委会
企业软件开发要求
纵横美国网络安全战略
服务器管理口是什么原因
java中向数据库添加信息
香港服务器ssr
c 实现数据库
魔兽服务器格瑞姆巴托
软件开发需求分析文档范例
软件开发应届生要求
网络安全会议ppt
服务器管理找不到
服务器寿命管理
天水网络安全处警室电话