diff --git a/plugins/dde-dock/common/commoniconbutton.cpp b/plugins/dde-dock/common/commoniconbutton.cpp index f5adb4a48..ce2cbde69 100644 --- a/plugins/dde-dock/common/commoniconbutton.cpp +++ b/plugins/dde-dock/common/commoniconbutton.cpp @@ -133,15 +133,19 @@ void CommonIconButton::setIcon(const QString &icon, const QString &fallback, con addDarkMark(tmp); addDarkMark(tmpFallback); } - m_icon = QIcon::fromTheme(tmp); + QIcon newIcon = QIcon::fromTheme(tmp); - if (m_icon.isNull()) { - m_icon = QIcon::fromTheme(tmpFallback); + if (newIcon.isNull()) { + newIcon = QIcon::fromTheme(tmpFallback); } - if (m_icon.isNull()) { + if (newIcon.isNull()) { QString defaultIcon = m_fileMapping[State::Default].first; - m_icon = QIcon::fromTheme(defaultIcon); + newIcon = QIcon::fromTheme(defaultIcon); + } + + if (!newIcon.isNull()) { + m_icon = newIcon; } update(); } @@ -213,6 +217,20 @@ void CommonIconButton::mouseReleaseEvent(QMouseEvent *event) void CommonIconButton::refreshIcon() { setState(m_state); + + if (m_icon.isNull()) { + // 主题切换后图标主题可能尚未加载完成,进行有限次重试 + if (m_refreshRetryCount < kMaxRefreshRetries) { + m_refreshRetryCount++; + QTimer::singleShot(50, this, [this]() { + refreshIcon(); + }); + } else { + m_refreshRetryCount = 0; + } + } else { + m_refreshRetryCount = 0; + } } void CommonIconButton::setIconSize(const QSize &size) diff --git a/plugins/dde-dock/common/commoniconbutton.h b/plugins/dde-dock/common/commoniconbutton.h index bf744b95e..fdc26ec22 100644 --- a/plugins/dde-dock/common/commoniconbutton.h +++ b/plugins/dde-dock/common/commoniconbutton.h @@ -73,6 +73,9 @@ public Q_SLOTS: QSize m_iconSize; qreal m_rotation; QPalette m_defaultPalette; + + static constexpr int kMaxRefreshRetries = 10; + int m_refreshRetryCount = 0; }; #endif // DOCKICONBUTTON_H diff --git a/src/loader/widgetplugin.cpp b/src/loader/widgetplugin.cpp index c5f3c276d..90d1f3674 100644 --- a/src/loader/widgetplugin.cpp +++ b/src/loader/widgetplugin.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include @@ -337,7 +338,9 @@ void WidgetPlugin::updateDockContainerState(PluginsItemInterface *itemInter, boo void WidgetPlugin::onDockColorThemeChanged(uint32_t type) { qDebug() << "onDockColorThemeChanged:" << type; - DGuiApplicationHelper::instance()->setPaletteType(static_cast(type)); + QTimer::singleShot(0, this, [type]() { + DGuiApplicationHelper::instance()->setPaletteType(static_cast(type)); + }); } void WidgetPlugin::onDockPositionChanged(uint32_t position)