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