From 67d4be57ad0707a32bb0ceaf8919410399a1fded Mon Sep 17 00:00:00 2001 From: Fangxun Zhao Date: Tue, 23 Jun 2026 20:05:39 +0800 Subject: [PATCH] fix(network): add hover opacity effect for widgets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Add QGraphicsOpacityEffect to QuickPanelWidget for icon, name and state labels with hover opacity transition 2. Add QGraphicsOpacityEffect to JumpSettingButton for icon and description labels on hover 3. Add QGraphicsOpacityEffect to NetItemWidget for hover feedback in net-view 4. Set normal opacity to 0.7 and hover opacity to 1.0 for consistent visual feedback 5. Implement enterEvent/leaveEvent in QuickPanelWidget to handle hover state Log: Add hover opacity effect to dock network plugin and net-view widgets for visual feedback fix(network): 添加悬停透明度效果 1. 为 QuickPanelWidget 的图标、名称和状态标签添加透明度效果,悬停时改变透明度 2. 为 JumpSettingButton 的图标和描述标签添加悬停透明度效果 3. 为 NetItemWidget 添加悬停透明度效果 4. 普通状态透明度设为 0.7,悬停状态设为 1.0,提供一致的视觉反馈 5. 在 QuickPanelWidget 中实现 enterEvent/leaveEvent 处理悬停状态 Log: 为网络插件和视图组件添加悬停透明度效果,优化交互反馈 PMS: BUG-314503 --- dock-network-plugin/quickpanelwidget.cpp | 38 ++++++++++++++++++- dock-network-plugin/quickpanelwidget.h | 12 +++++- .../widget/jumpsettingbutton.cpp | 20 +++++++++- .../widget/jumpsettingbutton.h | 7 +++- net-view/window/private/netdelegate.cpp | 6 +++ net-view/window/private/netdelegate.h | 4 ++ 6 files changed, 82 insertions(+), 5 deletions(-) diff --git a/dock-network-plugin/quickpanelwidget.cpp b/dock-network-plugin/quickpanelwidget.cpp index e61f7c41..523277bd 100644 --- a/dock-network-plugin/quickpanelwidget.cpp +++ b/dock-network-plugin/quickpanelwidget.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. +// Copyright (C) 2022 ~ 2026 Deepin Technology Co., Ltd. // SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -68,6 +68,11 @@ QuickPanelWidget::QuickPanelWidget(QWidget *parent) , m_nameLabel(new DLabel(this)) , m_stateLabel(new DLabel(this)) , m_expandLabel(new DIconButton(this)) + , m_iconOpacityEffect(new QGraphicsOpacityEffect(this)) + , m_nameOpacityEffect(new QGraphicsOpacityEffect(this)) + , m_stateOpacityEffect(new QGraphicsOpacityEffect(this)) + , m_hover(false) + , m_active(true) { initUi(); initConnection(); @@ -98,7 +103,9 @@ void QuickPanelWidget::setDescription(const QString &description) void QuickPanelWidget::setActive(bool active) { + m_active = active; m_iconWidget->setBackgroundRole(active ? QPalette::Highlight : QPalette::BrightText); + m_iconOpacityEffect->setOpacity(active ? 1.0 : (m_hover ? kHoverOpacity : kNormalOpacity)); } void QuickPanelWidget::mousePressEvent(QMouseEvent *event) @@ -126,6 +133,26 @@ void QuickPanelWidget::mouseReleaseEvent(QMouseEvent *event) m_clickPoint = QPoint(); return QWidget::mouseReleaseEvent(event); } + +void QuickPanelWidget::enterEvent(QEnterEvent *event) +{ + m_hover = true; + m_nameOpacityEffect->setOpacity(kHoverOpacity); + m_stateOpacityEffect->setOpacity(kHoverOpacity); + if (!m_active) + m_iconOpacityEffect->setOpacity(kHoverOpacity); + QWidget::enterEvent(event); +} + +void QuickPanelWidget::leaveEvent(QEvent *event) +{ + m_hover = false; + m_nameOpacityEffect->setOpacity(kNormalOpacity); + m_stateOpacityEffect->setOpacity(kNormalOpacity); + if (!m_active) + m_iconOpacityEffect->setOpacity(kNormalOpacity); + QWidget::leaveEvent(event); +} void QuickPanelWidget::initUi() { @@ -154,6 +181,15 @@ void QuickPanelWidget::initUi() m_iconWidget->setCheckable(false); m_iconWidget->setFixedSize(QSize(40, 40)); m_iconWidget->setFocusPolicy(Qt::NoFocus); + + m_iconOpacityEffect->setOpacity(kNormalOpacity); + m_iconWidget->setGraphicsEffect(m_iconOpacityEffect); + + m_nameOpacityEffect->setOpacity(kNormalOpacity); + m_nameLabel->setGraphicsEffect(m_nameOpacityEffect); + + m_stateOpacityEffect->setOpacity(kNormalOpacity); + m_stateLabel->setGraphicsEffect(m_stateOpacityEffect); // 进入图标 m_expandLabel->setIcon(DStyle::standardIcon(style(), DStyle::SP_ArrowEnter)); diff --git a/dock-network-plugin/quickpanelwidget.h b/dock-network-plugin/quickpanelwidget.h index 77dd0a15..0b87b277 100644 --- a/dock-network-plugin/quickpanelwidget.h +++ b/dock-network-plugin/quickpanelwidget.h @@ -1,4 +1,4 @@ -// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd. +// Copyright (C) 2022 ~ 2026 Deepin Technology Co., Ltd. // SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -10,6 +10,7 @@ #include #include +#include class QLabel; @@ -36,6 +37,8 @@ public Q_SLOTS: void iconClicked(); protected: + void enterEvent(QEnterEvent *event) override; + void leaveEvent(QEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; @@ -48,6 +51,13 @@ public Q_SLOTS: Dtk::Widget::DLabel *m_nameLabel; Dtk::Widget::DLabel *m_stateLabel; Dtk::Widget::DIconButton *m_expandLabel; + QGraphicsOpacityEffect *m_iconOpacityEffect; + QGraphicsOpacityEffect *m_nameOpacityEffect; + QGraphicsOpacityEffect *m_stateOpacityEffect; + bool m_hover; + bool m_active; + static constexpr qreal kNormalOpacity = 0.7; + static constexpr qreal kHoverOpacity = 1.0; QPoint m_clickPoint; }; } // namespace network diff --git a/dock-network-plugin/widget/jumpsettingbutton.cpp b/dock-network-plugin/widget/jumpsettingbutton.cpp index fa9a6501..69d70608 100644 --- a/dock-network-plugin/widget/jumpsettingbutton.cpp +++ b/dock-network-plugin/widget/jumpsettingbutton.cpp @@ -22,6 +22,8 @@ JumpSettingButton::JumpSettingButton(QWidget *parent) , m_autoShowPage(true) , m_iconButton(new CommonIconButton(this)) , m_descriptionLabel(new DLabel(this)) + , m_iconOpacityEffect(new QGraphicsOpacityEffect(this)) + , m_descOpacityEffect(new QGraphicsOpacityEffect(this)) { initUI(); } @@ -32,6 +34,8 @@ JumpSettingButton::JumpSettingButton(const QIcon& icon, const QString& descripti , m_autoShowPage(true) , m_iconButton(new CommonIconButton(this)) , m_descriptionLabel(new DLabel(this)) + , m_iconOpacityEffect(new QGraphicsOpacityEffect(this)) + , m_descOpacityEffect(new QGraphicsOpacityEffect(this)) { initUI(); @@ -59,6 +63,13 @@ void JumpSettingButton::initUI() layout->setContentsMargins(10, 0, 10, 0); layout->addWidget(m_iconButton); layout->addWidget(m_descriptionLabel); + + m_iconOpacityEffect->setOpacity(kNormalOpacity); + m_iconButton->setGraphicsEffect(m_iconOpacityEffect); + + m_descOpacityEffect->setOpacity(kNormalOpacity); + m_descriptionLabel->setGraphicsEffect(m_descOpacityEffect); + layout->addStretch(); } @@ -76,11 +87,16 @@ bool JumpSettingButton::event(QEvent* e) { switch (e->type()) { case QEvent::Leave: - case QEvent::Enter: + case QEvent::Enter: { m_hover = e->type() == QEvent::Enter; + qreal opacity = m_hover ? kHoverOpacity : kNormalOpacity; + m_iconOpacityEffect->setOpacity(opacity); + m_descOpacityEffect->setOpacity(opacity); update(); - break; + } break; case QEvent::Hide: + m_iconOpacityEffect->setOpacity(kNormalOpacity); + m_descOpacityEffect->setOpacity(kNormalOpacity); m_hover = false; update(); break; diff --git a/dock-network-plugin/widget/jumpsettingbutton.h b/dock-network-plugin/widget/jumpsettingbutton.h index 9a6ba9e4..4ed27f07 100644 --- a/dock-network-plugin/widget/jumpsettingbutton.h +++ b/dock-network-plugin/widget/jumpsettingbutton.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later @@ -9,6 +9,7 @@ #include #include +#include #include @@ -44,6 +45,10 @@ class JumpSettingButton : public QFrame QString m_secondPage; CommonIconButton *m_iconButton; Dtk::Widget::DLabel *m_descriptionLabel; + QGraphicsOpacityEffect *m_iconOpacityEffect; + QGraphicsOpacityEffect *m_descOpacityEffect; + static constexpr qreal kNormalOpacity = 0.7; + static constexpr qreal kHoverOpacity = 1.0; }; #endif diff --git a/net-view/window/private/netdelegate.cpp b/net-view/window/private/netdelegate.cpp index 82c4ac42..15c85c7c 100644 --- a/net-view/window/private/netdelegate.cpp +++ b/net-view/window/private/netdelegate.cpp @@ -28,6 +28,7 @@ #include #include #include +#include DWIDGET_USE_NAMESPACE @@ -891,7 +892,10 @@ NetItemWidget::NetItemWidget(NetItem *item, QWidget *parent) : NetWidget (item, parent) , m_portalLabel (nullptr) , m_isEnter(false) + , m_opacityEffect(new QGraphicsOpacityEffect(this)) { + m_opacityEffect->setOpacity(kNormalOpacity); + setGraphicsEffect(m_opacityEffect); } void NetItemWidget::removePasswordWidget() @@ -912,6 +916,8 @@ void NetItemWidget::removePasswordWidget() void NetItemWidget::setHover(bool isHover) { + m_opacityEffect->setOpacity(isHover ? kHoverOpacity : kNormalOpacity); + if (!m_portalLabel) return; diff --git a/net-view/window/private/netdelegate.h b/net-view/window/private/netdelegate.h index 4a19c168..c8f4deee 100644 --- a/net-view/window/private/netdelegate.h +++ b/net-view/window/private/netdelegate.h @@ -13,6 +13,7 @@ class QSortFilterProxyModel; class QVBoxLayout; +class QGraphicsOpacityEffect; class QLabel; namespace Dtk { @@ -181,6 +182,9 @@ protected slots: QLabel *m_portalLabel; NetType::NetManagerFlags m_flag; bool m_isEnter; + QGraphicsOpacityEffect *m_opacityEffect; + static constexpr qreal kNormalOpacity = 0.7; + static constexpr qreal kHoverOpacity = 1.0; }; class NetWirelessWidget : public NetItemWidget