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

      简单的做了一个类似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();
}
  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值