cpp
复制代码
/*
** File name: NoticeWidget.h
** Author:
** Date: 2025-04-25
** Brief: 通知栏控件
** Copyright (C) [email protected] All rights reserved.
*/
#include "../Include/NoticeWidget.h"
#include <QVBoxLayout>
#include <QPainter>
#include <QBitmap>
#include <QDesktopWidget>
#include <QDesktopServices>
#include <QApplication>
CNoticeWidget::CNoticeWidget(QWidget* parent)
: QWidget(parent)
{
m_bMouseEnter = false;
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_TranslucentBackground);
m_pTitleLabel = new QLabel(this);
m_pTitleLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
m_pTitleLabel->setFixedSize(300, 20);
m_pTitleLabel->setMargin(5);
m_pMessageLabel = new QLabel(this);
m_pMessageLabel->setAlignment(Qt::AlignTop);
m_pMessageLabel->setWordWrap(true);
m_pMessageLabel->setFixedSize(300, 100);
QHBoxLayout* m_pTitleLayout = new QHBoxLayout;
m_pTitleLayout->setMargin(0);
m_pTitleLayout->addWidget(m_pTitleLabel);
m_pbtnlose = new QPushButton(this);
m_pbtnlose->setStyleSheet("QPushButton { color: white; border: none; }");
connect(m_pbtnlose, &QPushButton::clicked, this, &CNoticeWidget::close);
m_pbtnlose->setFixedSize(20, 20);
m_pbtnlose->setIcon(QIcon(":/Delete.png"));
m_pbtnlose->setIconSize(QSize(12, 12));
m_pTitleLayout->addWidget(m_pbtnlose);
QVBoxLayout* m_pLayout = new QVBoxLayout;
m_pLayout->setMargin(0);
m_pLayout->addLayout(m_pTitleLayout);
m_pLayout->addWidget(m_pMessageLabel);
m_pMessageLabel->setMargin(5);
setLayout(m_pLayout);
setFixedSize(sizeHint().width(), sizeHint().height());
m_pShowTimer = new QTimer(this);
connect(m_pShowTimer, &QTimer::timeout, this, [this]()
{
static int nBeginY = QApplication::desktop()->height();
nBeginY--;
move(m_ptShowPos.x(), nBeginY);
if (nBeginY <= m_ptShowPos.y())
{
m_pShowTimer->stop();
m_pStayTimer->start(1000);
}
});
m_pStayTimer = new QTimer(this);
connect(m_pStayTimer, &QTimer::timeout, this, [this]()
{
static int nTimeCount = 0;
nTimeCount++;
if (nTimeCount >= 9)
{
m_pStayTimer->stop();
m_pCloseTimer->start(200);
}
});
m_pCloseTimer = new QTimer(this);
connect(m_pCloseTimer, &QTimer::timeout, this, [this]()
{
static int nTran = 1.0;
if (m_bMouseEnter)
{
nTran = 1.0;
setWindowOpacity(nTran);
return;
}
nTran -= 0.1;
if (nTran <= 0.0)
{
m_pCloseTimer->stop();
close();
}
else
{
setWindowOpacity(nTran);
}
});
}
CNoticeWidget::~CNoticeWidget()
{
}
void CNoticeWidget::SetMessage(const QString& qstrTitle, const QString& qstrMessage)
{
m_pTitleLabel->setText(qstrTitle);
m_pMessageLabel->setText( " " + qstrMessage);
QDesktopWidget* pDeskTop = QApplication::desktop();
QRect rcDeskTop = pDeskTop->availableGeometry();
m_ptShowPos = QPoint(rcDeskTop.width() - width() - 1, rcDeskTop.height() - height());
move(m_ptShowPos.x(), rcDeskTop.height() - 1);
show();
m_pShowTimer->start(5);
}
void CNoticeWidget::paintEvent(QPaintEvent* event)
{
QBitmap bitmap(size());
bitmap.fill(Qt::white);
QPainter painter(this);
painter.setBrush(QBrush(QColor(250, 240, 230)));
painter.setPen(QPen(QBrush(QColor(250, 222, 173)), 4));
painter.drawRoundedRect(bitmap.rect(), 5, 5);
setMask(bitmap);
QWidget::paintEvent(event);
}
void CNoticeWidget::enterEvent(QEvent* event)
{
m_bMouseEnter = true;
QWidget::enterEvent(event);
}
void CNoticeWidget::leaveEvent(QEvent* event)
{
m_bMouseEnter = false;
QWidget::leaveEvent(event);
}