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++

#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);
}