From 835b9fcdd8d9e4ca1fce1b36e25751613f23a0e3 Mon Sep 17 00:00:00 2001 From: impressionyang Date: Thu, 11 Jun 2026 17:27:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20QStyle=20=E6=A0=87=E5=87=86=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E5=88=87=E6=8D=A2=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 就绪/停止: SP_MediaStop (■) - 录音/识别: SP_MediaPlay (▶) 避免自定义绘制导致的黑色方块问题,使用 Qt 原生支持的 系统标准图标,跨平台兼容性好。 Co-Authored-By: Claude Opus 4.7 --- src/ui/main_window.cpp | 17 +++++++++++------ src/ui/main_window.h | 2 ++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/ui/main_window.cpp b/src/ui/main_window.cpp index 428fa5c..ae5fd63 100644 --- a/src/ui/main_window.cpp +++ b/src/ui/main_window.cpp @@ -126,10 +126,11 @@ void MainWindow::setupTrayIcon() { trayIcon_ = new QSystemTrayIcon(this); trayIcon_->setContextMenu(trayMenu_); - // 使用应用窗口图标作为托盘图标,避免自定义绘制导致的黑色方块 - trayIcon_->setIcon(windowIcon().isNull() ? - style()->standardIcon(QStyle::SP_ComputerIcon) : - windowIcon()); + // 默认状态:停止图标(SP_MediaStop) + idleIcon_ = style()->standardIcon(QStyle::SP_MediaStop); + activeIcon_ = style()->standardIcon(QStyle::SP_MediaPlay); + + trayIcon_->setIcon(idleIcon_); trayIcon_->setToolTip("Impress Voice Input - 语音输入就绪"); trayIcon_->show(); @@ -148,8 +149,12 @@ void MainWindow::setupTrayIcon() { void MainWindow::updateTrayIcon(const QString& status) { if (!trayIcon_) return; - // 根据状态设置 tooltip,图标保持统一的应用图标 - // 避免使用自定义 QPixmap(在某些平台/主题下会显示为黑色方块) + // 录音/识别 → 播放图标,就绪/停止 → 停止图标 + if (status.contains("正在录音") || status.contains("正在识别")) { + trayIcon_->setIcon(activeIcon_); + } else { + trayIcon_->setIcon(idleIcon_); + } trayIcon_->setToolTip(QString("Impress Voice Input - %1").arg(status)); } diff --git a/src/ui/main_window.h b/src/ui/main_window.h index d223126..46e5ac7 100644 --- a/src/ui/main_window.h +++ b/src/ui/main_window.h @@ -56,6 +56,8 @@ private: QLabel* modelStatusLabel_; QSystemTrayIcon* trayIcon_ = nullptr; QMenu* trayMenu_ = nullptr; + QIcon idleIcon_; // SP_MediaStop — 就绪/停止 + QIcon activeIcon_; // SP_MediaPlay — 录音/识别 }; } // namespace impress