Qt 实现桌面右下角消息弹窗提示

Posted Nick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 实现桌面右下角消息弹窗提示相关的知识,希望对你有一定的参考价值。

  简单的做了一个类似QQ消息提示的消息弹窗提示的小模块,便于在系统后台程序提示检测的信息,使用Qt开发,设计整体思路是做一个无框架的widget,自己实现标题栏和内容栏,添加了向上移出,自动消隐退出效果,窗体简单,模块结构便于以后进行扩展和移植,旨在显示文字信息,通过按钮操作与主程序进行通信,运行结果如图

一、弹窗主体部分 class widget

  1 #include "widget.h"
  2 
  3 #include "titlewidget.h"
  4 
  5 #include <QVBoxLayout>
  6 
  7 #include "mypushbutton.h"
  8 
  9 #include <QLabel>
 10 
 11 #include <QPainter>
 12 
 13 #include <QBitmap>
 14 
 15 #include <QDesktopWidget>
 16 
 17 #include <QApplication>
 18 
 19 #include <QTimer>
 20 
 21 #include <QDesktopServices>
 22 
 23  
 24 
 25 Widget::Widget(QWidget *parent) :
 26 
 27     QWidget(parent)
 28 
 29 {
 30 
 31     setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
 32 
 33 isEnter = false;
 34 
 35     titleW=new titleWidget;
 36 
 37     connect(titleW,SIGNAL(myClose()),this,SLOT(close()));
 38 
 39  
 40 
 41     content=new QLabel;
 42 
 43     content->setWordWrap(true);
 44 
 45     content->setAlignment(Qt::AlignTop);
 46 
 47     content->setFixedSize(300,100);
 48 
 49     btnLook=new myPushButton("look.png","查看");
 50 
 51     connect(btnLook,SIGNAL(clicked()),this,SLOT(seeInfo()));
 52 
 53  
 54 
 55     QVBoxLayout*mainLayout=new QVBoxLayout;
 56 
 57     mainLayout->setMargin(0);
 58 
 59     mainLayout->addWidget(titleW);
 60 
 61     mainLayout->addWidget(content);
 62 
 63     content->setMargin(5);
 64 
 65     mainLayout->addWidget(btnLook,0,Qt::AlignRight);
 66 
 67     setLayout(mainLayout);
 68 
 69  
 70 
 71     setFixedSize(sizeHint().width(),sizeHint().height());
 72 
 73  
 74 
 75     timerShow=new QTimer(this);
 76 
 77     connect(timerShow,SIGNAL(timeout()),this,SLOT(myMove()));
 78 
 79     timerStay=new QTimer(this);
 80 
 81     connect(timerStay,SIGNAL(timeout()),this,SLOT(myStay()));
 82 
 83     timerClose=new QTimer(this);
 84 
 85     connect(timerClose,SIGNAL(timeout()),this,SLOT(myClose()));
 86 
 87 }
 88 
 89  
 90 
 91 Widget::~Widget()
 92 
 93 {
 94 
 95 }
 96 
 97  
 98 
 99 void Widget::setMsg(QString title, QString content, QString work)
100 
101 {
102 
103     titleW->setTitleText("  "+title);
104 
105     this->content->setText("   "+content);
106 
107 }
108 
109  
110 
111 void Widget::paintEvent(QPaintEvent *)
112 
113 {
114 
115     QBitmap bitmap(this->size());
116 
117     bitmap.fill(Qt::white);
118 
119     QPainter painter(this);
120 
121     painter.setBrush(QBrush(QColor(250,240,230)));
122 
123     painter.setPen(QPen(QBrush(QColor(255,222,173)),4));
124 
125     painter.drawRoundedRect(bitmap.rect(),5,5);
126 
127     setMask(bitmap);
128 
129 }
130 
131 void Widget::showAsQQ()
132 
133 {
134 
135     QDesktopWidget *deskTop=QApplication::desktop();
136 
137     deskRect=deskTop->availableGeometry();
138 
139  
140 
141     normalPoint.setX(deskRect.width()-rect().width()-1);
142 
143     normalPoint.setY(deskRect.height()-rect().height());
144 
145     move(normalPoint.x(),deskRect.height()-1);
146 
147     show();
148 
149     timerShow->start(5);
150 
151 }
152 
153 //平滑显示出来
154 
155 void Widget::myMove()
156 
157 {
158 
159     static int beginY=QApplication::desktop()->height();
160 
161     beginY--;
162 
163     move(normalPoint.x(),beginY);
164 
165     if(beginY<=normalPoint.y())
166 
167     {
168 
169         timerShow->stop();
170 
171         timerStay->start(1000);
172 
173     }
174 
175 }
176 
177 //停留显示
178 
179 void Widget::myStay()
180 
181 {
182 
183     static int timeCount=0;
184 
185     timeCount++;
186 
187     if(timeCount>=9)
188 
189     {
190 
191         timerStay->stop();
192 
193         timerClose->start(200);
194 
195     }
196 
197 }
198 
199 //自动关闭时实现淡出效果
200 
201 void Widget::myClose()
202 
203 {
204 
205 static double tran=1.0;
206 
207 if(isEnter){
208 
209 tran = 1.0;
210 
211 setWindowOpacity(tran);
212 
213 return;
214 
215 }
216 
217     tran-=0.1;
218 
219     if(tran<=0.0)
220 
221     {
222 
223         timerClose->stop();
224 
225         emit close();
226 
227     }
228 
229     else
230 
231         setWindowOpacity(tran);
232 
233 }
234 
235 void Widget::seeInfo()
236 
237 {
238 
239     
240 
241 }
242 
243  
244 
245 void Widget::enterEvent(QEvent *)
246 
247 {
248 
249 isEnter = true;
250 
251 }
252 
253 void Widget::leaveEvent(QEvent *)
254 
255 {
256 
257     isEnter = false;
258 
259 }

二、标题部分与自定义按钮部分

  1 //标题类 class titlewidget
  2 #include "titlewidget.h"
  3 #include <QLabel>
  4 #include <QToolButton>
  5 #include <QHBoxLayout>
  6 #include <QPainter>
  7 #include <QLinearGradient>
  8 #include <QIcon>
  9 
 10 titleWidget::titleWidget(QWidget *parent) :
 11     QWidget(parent)
 12 {
 13     titleText=new QLabel;
 14     btnClose = new QToolButton(this);
 15     btnClose->setObjectName(QString::fromUtf8("btnClose"));
 16     btnClose->setToolTip(tr("关闭"));
 17     btnClose->setStyleSheet(QString::fromUtf8("QWidget[objectName=\\"btnClose\\"]{\\n"
 18         "border-width: 0px;\\n"
 19         "border-style: solid;\\n"
 20         "padding: 0px;\\n"
 21         "padding-left: 0px;\\n"
 22         "padding-right: 0px;\\n"
 23         "min-width: 16px;\\n"
 24         "max-width: 16px;\\n"
 25         "min-height: 16px;\\n"
 26         "max-height: 16px;\\n"
 27         "background-image: url(:/Resources/btn_close_normal.bmp);\\n"
 28         "}\\n"
 29         "\\n"
 30         "QWidget[objectName=\\"btnClose\\"]:hover{\\n"
 31         "background-image: url(:/Resources/btn_close_highlight.bmp);\\n"
 32         "}\\n"
 33         "\\n"
 34         "QWidget[objectName=\\"btnClose\\"]:pressed{\\n"
 35         "background-image: url(:/Resources/btn_close_down.bmp);\\n"
 36         "}\\n"
 37         ""));
 38     connect(btnClose,SIGNAL(clicked()),this,SIGNAL(myClose()));
 39     QHBoxLayout *layout=new QHBoxLayout;
 40     layout->addWidget(titleText,0,Qt::AlignLeft);
 41     layout->addStretch();
 42     layout->addWidget(btnClose,0,Qt::AlignRight);
 43     layout->setMargin(0);
 44     setLayout(layout);
 45     setFixedHeight(20);
 46 }
 47 
 48 void titleWidget::paintEvent(QPaintEvent *)
 49 {
 50     QLinearGradient linear(rect().topLeft(),rect().bottomRight());
 51     linear.setColorAt(0,QColor(227,207,87));
 52     linear.setColorAt(0.5,QColor(245,222,179));
 53     linear.setColorAt(1,QColor(189,252,201));
 54 
 55     QPainter painter(this);
 56     painter.setBrush(QBrush(linear));
 57     painter.setPen(Qt::NoPen);
 58     painter.drawRect(rect());
 59 }
 60 
 61 void titleWidget::setTitleText(QString title)
 62 {
 63     titleText->setText(title);
 64 }
 65 //按钮类:class mypushbutton
 66 #include "mypushbutton.h"
 67 #include <QPalette>
 68 #include <QPixmap>
 69 #include <QCursor>
 70 
 71 myPushButton::myPushButton(QWidget *parent) :
 72     QPushButton(parent)
 73 {
 74 }
 75 myPushButton::myPushButton(QString iconStr,QString textStr, QWidget *parent):QPushButton(parent)
 76 {
 77     QPixmap pixmap(":/Resources/"+iconStr);
 78     setIcon(QIcon(pixmap));
 79     setIconSize(pixmap.size());
 80     setText(textStr);
 81     resize(pixmap.size());
 82     setBkPalette(0);//设置背景完全透明
 83     setFlat(true);
 84     setAutoFillBackground(true);
 85 }
 86 
 87 void myPushButton::setBkPalette(int transparency)//设置背景透明度
 88 {
 89    QPalette palette;
 90    palette.setBrush(QPalette::Button,QBrush(QColor(255,255,255,transparency)));
 91    setPalette(palette);
 92 }
 93 void myPushButton::enterEvent(QEvent *)
 94 {
 95     setCursor(Qt::PointingHandCursor);
 96 }
 97 void myPushButton::leaveEvent(QEvent *)
 98 {
 99     setCursor(Qt::CustomCursor);
100 }
101 void myPushButton::mousePressEvent(QMouseEvent *e)
102 {
103     
104 }
105 void myPushButton::mouseReleaseEvent(QMouseEvent *e)
106 {
107 
108     emit clicked();
109 }

 

以上是关于Qt 实现桌面右下角消息弹窗提示的主要内容,如果未能解决你的问题,请参考以下文章

qt窗口左下角在鼠标位置弹出

QT 写一个属于自己的消息弹窗MessageBox

QT 写一个属于自己的消息弹窗MessageBox

JFrame 桌面右下角弹窗

桌面广告弹窗如何关闭 关掉你最讨厌的广告弹窗的方法

如何关掉屏蔽电脑桌面的弹窗广告