Qt 实现桌面右下角消息弹窗提示
Qt 实现桌面右下角消息弹窗提示
2013-11-06 11:29:14 _小明 阅读数 4476更多
分类专栏: Qt笔记
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.****.net/u012739657/article/details/14224161
简单的做了一个类似QQ消息提示的消息弹窗提示的小模块,便于在系统后台程序提示检测的信息,使用Qt开发,设计整体思路是做一个无框架的widget,自己实现标题栏和内容栏,添加了向上移出,自动消隐退出效果,窗体简单,模块结构便于以后进行扩展和移植,旨在显示文字信息,通过按钮操作与主程序进行通信,运行结果如图
一、弹窗主体部分 class widget
-
#include "widget.h"
-
#include "titlewidget.h"
-
#include <QVBoxLayout>
-
#include "mypushbutton.h"
-
#include <QLabel>
-
#include <QPainter>
-
#include <QBitmap>
-
#include <QDesktopWidget>
-
#include <QApplication>
-
#include <QTimer>
-
#include <QDesktopServices>
-
Widget::Widget(QWidget *parent) :
-
QWidget(parent)
-
{
-
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
-
isEnter = false;
-
titleW=new titleWidget;
-
connect(titleW,SIGNAL(myClose()),this,SLOT(close()));
-
content=new QLabel;
-
content->setWordWrap(true);
-
content->setAlignment(Qt::AlignTop);
-
content->setFixedSize(300,100);
-
btnLook=new myPushButton("look.png","查看");
-
connect(btnLook,SIGNAL(clicked()),this,SLOT(seeInfo()));
-
QVBoxLayout*mainLayout=new QVBoxLayout;
-
mainLayout->setMargin(0);
-
mainLayout->addWidget(titleW);
-
mainLayout->addWidget(content);
-
content->setMargin(5);
-
mainLayout->addWidget(btnLook,0,Qt::AlignRight);
-
setLayout(mainLayout);
-
setFixedSize(sizeHint().width(),sizeHint().height());
-
timerShow=new QTimer(this);
-
connect(timerShow,SIGNAL(timeout()),this,SLOT(myMove()));
-
timerStay=new QTimer(this);
-
connect(timerStay,SIGNAL(timeout()),this,SLOT(myStay()));
-
timerClose=new QTimer(this);
-
connect(timerClose,SIGNAL(timeout()),this,SLOT(myClose()));
-
}
-
Widget::~Widget()
-
{
-
}
-
void Widget::setMsg(QString title, QString content, QString work)
-
{
-
titleW->setTitleText(" "+title);
-
this->content->setText(" "+content);
-
}
-
void Widget::paintEvent(QPaintEvent *)
-
{
-
QBitmap bitmap(this->size());
-
bitmap.fill(Qt::white);
-
QPainter painter(this);
-
painter.setBrush(QBrush(QColor(250,240,230)));
-
painter.setPen(QPen(QBrush(QColor(255,222,173)),4));
-
painter.drawRoundedRect(bitmap.rect(),5,5);
-
setMask(bitmap);
-
}
-
void Widget::showAsQQ()
-
{
-
QDesktopWidget *deskTop=QApplication::desktop();
-
deskRect=deskTop->availableGeometry();
-
normalPoint.setX(deskRect.width()-rect().width()-1);
-
normalPoint.setY(deskRect.height()-rect().height());
-
move(normalPoint.x(),deskRect.height()-1);
-
show();
-
timerShow->start(5);
-
}
-
//平滑显示出来
-
void Widget::myMove()
-
{
-
static int beginY=QApplication::desktop()->height();
-
beginY--;
-
move(normalPoint.x(),beginY);
-
if(beginY<=normalPoint.y())
-
{
-
timerShow->stop();
-
timerStay->start(1000);
-
}
-
}
-
//停留显示
-
void Widget::myStay()
-
{
-
static int timeCount=0;
-
timeCount++;
-
if(timeCount>=9)
-
{
-
timerStay->stop();
-
timerClose->start(200);
-
}
-
}
-
//自动关闭时实现淡出效果
-
void Widget::myClose()
-
{
-
static double tran=1.0;
-
if(isEnter){
-
tran = 1.0;
-
setWindowOpacity(tran);
-
return;
-
}
-
tran-=0.1;
-
if(tran<=0.0)
-
{
-
timerClose->stop();
-
emit close();
-
}
-
else
-
setWindowOpacity(tran);
-
}
-
void Widget::seeInfo()
-
{
-
}
-
void Widget::enterEvent(QEvent *)
-
{
-
isEnter = true;
-
}
-
void Widget::leaveEvent(QEvent *)
-
{
-
isEnter = false;
-
}
二、标题部分与自定义按钮部分
-
//标题类 class titlewidget
-
#include "titlewidget.h"
-
#include <QLabel>
-
#include <QToolButton>
-
#include <QHBoxLayout>
-
#include <QPainter>
-
#include <QLinearGradient>
-
#include <QIcon>
-
titleWidget::titleWidget(QWidget *parent) :
-
QWidget(parent)
-
{
-
titleText=new QLabel;
-
btnClose = new QToolButton(this);
-
btnClose->setObjectName(QString::fromUtf8("btnClose"));
-
btnClose->setToolTip(tr("关闭"));
-
btnClose->setStyleSheet(QString::fromUtf8("QWidget[objectName=\"btnClose\"]{\n"
-
"border-width: 0px;\n"
-
"border-style: solid;\n"
-
"padding: 0px;\n"
-
"padding-left: 0px;\n"
-
"padding-right: 0px;\n"
-
"min-width: 16px;\n"
-
"max-width: 16px;\n"
-
"min-height: 16px;\n"
-
"max-height: 16px;\n"
-
"background-image: url(:/Resources/btn_close_normal.bmp);\n"
-
"}\n"
-
"\n"
-
"QWidget[objectName=\"btnClose\"]:hover{\n"
-
"background-image: url(:/Resources/btn_close_highlight.bmp);\n"
-
"}\n"
-
"\n"
-
"QWidget[objectName=\"btnClose\"]:pressed{\n"
-
"background-image: url(:/Resources/btn_close_down.bmp);\n"
-
"}\n"
-
""));
-
connect(btnClose,SIGNAL(clicked()),this,SIGNAL(myClose()));
-
QHBoxLayout *layout=new QHBoxLayout;
-
layout->addWidget(titleText,0,Qt::AlignLeft);
-
layout->addStretch();
-
layout->addWidget(btnClose,0,Qt::AlignRight);
-
layout->setMargin(0);
-
setLayout(layout);
-
setFixedHeight(20);
-
}
-
void titleWidget::paintEvent(QPaintEvent *)
-
{
-
QLinearGradient linear(rect().topLeft(),rect().bottomRight());
-
linear.setColorAt(0,QColor(227,207,87));
-
linear.setColorAt(0.5,QColor(245,222,179));
-
linear.setColorAt(1,QColor(189,252,201));
-
QPainter painter(this);
-
painter.setBrush(QBrush(linear));
-
painter.setPen(Qt::NoPen);
-
painter.drawRect(rect());
-
}
-
void titleWidget::setTitleText(QString title)
-
{
-
titleText->setText(title);
-
}
-
//按钮类:class mypushbutton
-
#include "mypushbutton.h"
-
#include <QPalette>
-
#include <QPixmap>
-
#include <QCursor>
-
myPushButton::myPushButton(QWidget *parent) :
-
QPushButton(parent)
-
{
-
}
-
myPushButton::myPushButton(QString iconStr,QString textStr, QWidget *parent):QPushButton(parent)
-
{
-
QPixmap pixmap(":/Resources/"+iconStr);
-
setIcon(QIcon(pixmap));
-
setIconSize(pixmap.size());
-
setText(textStr);
-
resize(pixmap.size());
-
setBkPalette(0);//设置背景完全透明
-
setFlat(true);
-
setAutoFillBackground(true);
-
}
-
void myPushButton::setBkPalette(int transparency)//设置背景透明度
-
{
-
QPalette palette;
-
palette.setBrush(QPalette::Button,QBrush(QColor(255,255,255,transparency)));
-
setPalette(palette);
-
}
-
void myPushButton::enterEvent(QEvent *)
-
{
-
setCursor(Qt::PointingHandCursor);
-
}
-
void myPushButton::leaveEvent(QEvent *)
-
{
-
setCursor(Qt::CustomCursor);
-
}
-
void myPushButton::mousePressEvent(QMouseEvent *e)
-
{
-
}
-
void myPushButton::mouseReleaseEvent(QMouseEvent *e)
-
{
-
emit clicked();
-
}