QT如何实现定时关闭消息提示框

QT如何实现定时关闭消息提示框

这篇文章主要为大家展示了“QT如何实现定时关闭消息提示框”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“QT如何实现定时关闭消息提示框”这篇文章吧。

一、简述

使用Qt简单实现提示框可定时自动关闭。

二、效果

三、工程结构

UI界面

四、源文件

NoticeWidget.pro文件

QT+=coreguigreaterThan(QT_MAJOR_VERSION,4):QT+=widgetsTARGET=NoticeTEMPLATE=appSOURCES+=main.cpp\mainwindow.cpp\noticewidget.cppHEADERS+=mainwindow.h\noticewidget.hFORMS+=mainwindow.ui

mainwindow.h文件

#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>namespaceUi{classMainWindow;}classMainWindow:publicQMainWindow{Q_OBJECTpublic:explicitMainWindow(QWidget*parent=0);~MainWindow();privateslots:voidon_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(newUi::MainWindow){ui->setupUi(this);setWindowTitle("定时自动关闭消息提示框");ui->plainTextEditMsg->setPlainText("定时自动关闭消息提示框测试,简单测试例子");}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_pushButtonShowNotice_clicked(){staticNoticeWidgetnoticeWin;noticeWin.Notice(this,ui->plainTextEditMsg->toPlainText(),3000);}

noticewidget.h文件

#ifndef_NoticeWidget_H_#define_NoticeWidget_H_#include<QLabel>#include<QTimer>//定时器间隔,单位ms#defineTIMER_INTERVAL_MS50//默认提示时间1s#defineNOTICE_DEF_DELAY_CNT(1000/TIMER_INTERVAL_MS)//透明度最大值255,也就是不透明#defineTRANSPARENT_MAX_VAL255//透明度递减值#defineTRANSPARENT_CUT_VAL(TRANSPARENT_MAX_VAL/NOTICE_DEF_DELAY_CNT+1)//大小比例#defineSIZE_SCALE0.8//间距调整#definePADDING4//样式,字体颜色:白色;圆角;背景色透明度#defineSTYLE_SHEET"color:white;border-radius:8px;background-color:rgba(80,80,80,%1);"classNoticeWidget:publicQLabel{Q_OBJECTpublic:voidNotice(QWidget*parent,constQString&msg,constintdelay_ms=2000);public:explicitNoticeWidget(QWidget*parent=0);~NoticeWidget();private:voidSetMesseage(constQString&msg,intdelay_ms);voidChangeSize();publicslots:voidOnTimerTimeout();private:QWidget*mParentPtr;QTimer*mTimerPtr;intmTimerCount;intmBaseWidth;//按一行时算的宽度intmBaseHeight;//一行高度intmTransparentVal;//透明度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=newQTimer(this);connect(mTimerPtr,SIGNAL(timeout()),this,SLOT(OnTimerTimeout()),Qt::UniqueConnection);}NoticeWidget::~NoticeWidget(){if(mTimerPtr->isActive()){mTimerPtr->stop();}deleteLater();}voidNoticeWidget::OnTimerTimeout(){--mTimerCount;if(0<mTimerCount){//重新定位(窗口大小和位置可能变化)if(nullptr!=mParentPtr){QPointpt((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);}}//设置要显示的消息voidNoticeWidget::SetMesseage(constQString&msg,intdelay_ms){mParentPtr=parentWidget();QFontMetricsfontMetrics(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;}//跟随父窗口大小变化voidNoticeWidget::ChangeSize(){if(nullptr!=mParentPtr){doublewd=mParentPtr->width()*SIZE_SCALE;//宽度占父窗口的80%setFixedSize((int)wd,mBaseHeight*(mBaseWidth/wd+1));}}//显示消息,可通过设置delay_ms=0来立即关闭显示voidNoticeWidget::Notice(QWidget*parent,constQString&msg,constintdelay_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"#include<QApplication>intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindoww;w.show();returna.exec();}

以上是“QT如何实现定时关闭消息提示框”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

发布于 2022-01-05 23:22:37
收藏
分享
海报
0 条评论
55
上一篇:SQL去重方法有哪些 下一篇:Android应用内悬浮窗Activity如何实现
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码