You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PayloadAPP/3rdparty/QNotify/include/NotifyWidget.cpp

182 lines
6.1 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "NotifyWidget.h"
#include "NotifyManager.h"
NotifyWidget::NotifyWidget(NotifyManager *manager, QWidget *parent)
: ArrangedWidget(
manager,
parent) // 这里将manager传入到父类ArrangedWidget中的m_manager了同时继承了可以使用父类manager来进行管理
{
// 初始化背景界面
m_pFrameBack = new QFrame(this);
m_pFrameBack->setGeometry(3, 3, width() - 6, height() - 6);
m_pFrameBack->setObjectName("notify-background");
// 初始化图标标签
m_pLabIcon = new QLabel(m_pFrameBack);
m_pLabIcon->setFixedSize(40, 40);
m_pLabIcon->setAlignment(Qt::AlignCenter);
m_pLabIcon->setWordWrap(true);
// 初始化标题栏标签
m_pLabTitle = new QLabel(m_pFrameBack);
m_pLabTitle->setObjectName("notify-title");
// 初始化内容标签
m_pLabBody = new QLabel(m_pFrameBack);
m_pLabBody->setObjectName("notify-body");
m_pLabBody->setAlignment(Qt::AlignLeft | Qt::AlignTop);
m_pLabBody->setWordWrap(true);
// 内容布局
QVBoxLayout *pLayoutContent = new QVBoxLayout;
pLayoutContent->addWidget(m_pLabTitle);
pLayoutContent->addWidget(m_pLabBody);
pLayoutContent->setStretch(1, 1);
// 主布局
QHBoxLayout *pLayoutMain = new QHBoxLayout(m_pFrameBack);
pLayoutMain->addWidget(m_pLabIcon);
pLayoutMain->addLayout(pLayoutContent);
pLayoutMain->setAlignment(m_pLabIcon, Qt::AlignTop);
// 初始化关闭按钮
m_pBtnClose = new QPushButton("×", m_pFrameBack);
m_pBtnClose->setObjectName("notify-close-btn");
m_pBtnClose->setFixedSize(24, 24);
m_pBtnClose->move(m_pFrameBack->width() - m_pBtnClose->width(), 0);
connect(m_pBtnClose, &QPushButton::clicked, this, &QObject::deleteLater);
// 设置样式
this->setStyleSheet(m_manager->styleSheet());
#ifdef Q_OS_WIN // linuxFb下设置边框阴影有问题故屏蔽
// 设置边框阴影
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
shadow->setOffset(0, 0);
shadow->setBlurRadius(5);
m_pFrameBack->setGraphicsEffect(shadow);
#endif
// 可见状态改变信号槽
connect(this, &ArrangedWidget::visibleChanged, [this](bool visible) {
if (visible) {
// 通知显示出来过了displayTime之后隐藏并自动销毁
int displayTime =
m_data.value("displayTime", m_manager->displayTime()).toInt();
QTimer::singleShot(displayTime, this, [this]() {
showArranged(0); // 隐藏
});
} else {
// 不可见,即隐藏了,则自动销毁
this->deleteLater();
}
});
}
// 获取数据
QVariantMap NotifyWidget::data() const {
return m_data;
}
// 设置数据
void NotifyWidget::setData(const QVariantMap &data) {
m_data = data;
// 设置默认图标
QPixmap icon;
QVariant iconv = data.value("icon");
if (iconv.type() == QVariant::Pixmap) icon = iconv.value<QPixmap>();
if (iconv.type() == QVariant::String)
icon = QPixmap(iconv.toString());
else
icon = QPixmap(m_manager->defaultIcon());
icon = icon.scaled(QSize(32, 32), Qt::KeepAspectRatio,
Qt::SmoothTransformation);
m_pLabIcon->setPixmap(icon);
// 设置内容
QString title = data.value("title").toString();
m_pLabTitle->setText(title);
// 计算可显示行数及长度
QString body = m_data.value("body").toString();
if (!body.isEmpty()) {
QSize s1 = m_pLabBody->size();
QSize s2 = m_pLabBody->fontMetrics().size(Qt::TextSingleLine, body);
int linecount = s1.height() / s2.height();
int charcount =
qFloor(1.0 * body.size() * s1.width() / s2.width()) * linecount;
QString bodyElid =
charcount > body.size() ? body : (body.left(charcount - 1) + "");
m_pLabBody->setText(bodyElid);
} else {
m_pLabBody->setVisible(false);
}
// 设置样式
if (data.contains("styleSheet"))
setStyleSheet(data.value("styleSheet").toString());
else if (data.contains("theme"))
setStyleSheet(m_manager->styleSheet(data.value("theme").toString()));
}
// 队列中的剩余通知数目
NotifyCountWidget::NotifyCountWidget(NotifyManager *manager, QWidget *parent)
: ArrangedWidget(manager, parent) {
// 初始化界面
this->setAttribute(Qt::WA_TransparentForMouseEvents, true);
// 初始化图标标签
m_pLabIcon = new QLabel(this);
m_pLabIcon->setFixedSize(32, 32);
m_pLabIcon->setAlignment(Qt::AlignCenter);
// 初始化剩余数目标签
m_pLabCount = new QLabel(this);
m_pLabCount->setObjectName("notify-count");
m_pLabCount->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
m_parentWidget = parent;
// 主布局
QHBoxLayout *pLayoutMain = new QHBoxLayout(this);
pLayoutMain->addWidget(m_pLabIcon);
pLayoutMain->addWidget(m_pLabCount);
// 文字阴影
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(this);
shadow->setOffset(2, 2);
shadow->setBlurRadius(5);
setGraphicsEffect(shadow);
setStyleSheet(
"#notify-count {"
"font: 20px Verdana;"
"color: #dd424d;"
"}");
// 设置图标
// QPixmap icon = QPixmap(m_manager->defaultIcon());
QPixmap icon = QPixmap(":/message.png");
icon = icon.scaled(QSize(32, 32), Qt::KeepAspectRatio,
Qt::SmoothTransformation);
m_pLabIcon->setPixmap(icon);
// 闪烁动画
flickerAnim = new QPropertyAnimation(this, "windowOpacity", this);
flickerAnim->setStartValue(1);
flickerAnim->setKeyValueAt(0.25, 0.1);
flickerAnim->setKeyValueAt(0.5, 1);
flickerAnim->setEndValue(1);
flickerAnim->setDuration(2000);
flickerAnim->setLoopCount(-1);
// 显示或隐藏的时候,显示动画
connect(this, &ArrangedWidget::visibleChanged, [this](bool visible) {
if (visible)
flickerAnim->start();
else
flickerAnim->stop();
});
}
// 设置剩余通知数目
void NotifyCountWidget::setCount(int count) {
m_pLabCount->setNum(count);
}