[AI Development Lab] 【deepin插件开发活动】DeskMon—DTK6 原生桌面系统监控(更新)
Tofloor
poster avatar
kookboy
deepin
2026-08-11 12:41
Author

【deepin 插件开发活动】DeskMon —— DTK6 原生桌面系统监控

Deepin 社区「10 亿 Token 奖池,写出属于你的 deepin 桌面插件」活动参赛作品

方向三:DTK 创新原生应用 · 作者:kookboy · 许可证:GPL-2.0

说点题外话,我不是专业开发者,只是工作之余对潮流技术感兴趣、喜欢折腾的普通爱好者,也算一路见证了互联网技术的发展。从用 HTML 搭建个人网站起步,到 ASP 网站与论坛、PHP 网站以及 Linux 的学习与安装,各种发行版都被我折腾了个遍——当然,这一切都只是工作之余的兴趣爱好。自从 AI 编程兴起以来,我便把实际遇到的问题、以及解决问题的想法,交给 AI 编程去一一实现,这个过程本身就是一种享受。最后,希望各位网友都能借助 AI 工具,把心中的梦想变成现实!

一句话介绍

DeskMon 是一款基于 DTK6 / Qt6(C++17) 原生实现的桌面悬浮系统监控小工具,从原 PyQt5 版迁移而来,自动跟随 deepin 亮/暗主题,单实例运行,自带系统托盘与原生 DTK 控件。不是脚本拼装,是原生 DTK 应用。

DeskMon 浅色主题 新

light.png

DeskMon 深色主题 新

dark.png

迷你模式,可放置在任务上。

迷你模式 浅色.png

迷你模式 深色.png

深色mini样式.png

托盘右键菜单

vlcsnap-2026-08-12-12h23m06s101.png

为什么做

开源地址发行版中提供 .deb 安装包下载,依赖自动解析,安装后从启动器搜「DeskMon / 桌面监控」即可。

之前用 PyQt5 写过一个系统监控小工具(1601 行),工作能用但有几个痛点:

维度 PyQt5 原版 DeskMon 新版
视觉 自绘深色,不随系统主题 原生 Chameleon 皮肤,亮/暗自动切换
窗口 自绘无边框,DDE 窗口管理不识别 DTK 原生窗口装饰
进度条 自绘 QProgressBar DProgressBar 语义化配色
单实例 无(会开多个窗口) DApplication::setSingleInstance()
托盘 非标准 DDE 标准系统托盘
主题 固定色 DPalette 跟随系统活跃色

正好借这次活动把它升级成「真·DTK 原生应用」,对应方向三。

功能清单

MVP 核心

  • 右下角无边框悬浮小窗(可拖动 / 右下角调整宽度)
  • 双形态呈现:完整悬浮窗 + 迷你浮动条(单行胶囊),托盘菜单或标题栏 ⊟ 按钮一键切换,切换即自动贴右下角边缘
  • CPU 使用率 + 温度
  • 内存使用率 + 已用/总量
  • GPU 使用率 + 显存占用 + 温度(有 NVIDIA 卡时,含后台异步查询)+ 显存进程列表与一键释放
  • 系统盘使用率
  • 网络上/下行速度 + 本机 IP(默认路由接口,过滤 docker 桥接)
  • 系统托盘:显示/隐藏、显示模式(完整/迷你)、GPU 显存管理、进程管理、透明度、设置、退出
  • 配置持久化:~/.config/deskmon/config.json
  • 开机自启动

一些特点

  • 📊 迷你浮动条:单行胶囊形态(圆点+首字母+百分比+网速+展开按钮),QStackedLayout 与完整窗切换、自动贴右下角边缘,双击展开,悬停 tooltip 显示温度/容量等完整信息
  • 🍅 番茄钟面板:25/5 分钟自动轮换,完成时 DNotifySender 系统通知,运行时番茄图标呼吸脉动动画
  • 📈 CPU/GPU 迷你折线图:最近 60 秒趋势,渐变填充 + 峰值圆点标记 + 暗色自适应网格
  • 🎨 主题自动跟随DPalette 语义化配色,指标色由系统活跃色派生,明暗主题自动调亮度
  • 🎮 显存一键释放DTableWidget 列出显存占用进程 + DDialog 确认释放
  • ⚙️ 原生设置面板:透明度滑条 / 刷新间隔 / 指标显隐 / 窗口置顶 / 开机自启
  • 🔔 阈值告警:CPU/GPU > 90% 边沿触发 + 系统通知(DNotifySender,悬浮窗隐藏时也能提醒)

原版【https://bbs.deepin.org.cn/post/296554】没有、新版做的

  • 紧凑长条指标行 MetricRow(点 + 名称 + 百分比 + 细条 + 附加信息)替代占高度的环形
  • 迷你浮动条 MiniBar:单行胶囊 ●C42% ●M68%,靠圆点颜色+首字母区分指标,悬停显示完整信息,与完整窗 QStackedLayout 原地切换(自动贴右下角边缘)
  • DDE GlobalTheme DBus 监听,补 DTK 默认不跟随主题之缺陷
  • 单实例 + 双击托盘激活
  • 全套矢量图标(主图标 / 托盘 / symbolic,多尺寸 PNG)

技术栈与关键 API

选型
语言 C++17
框架 DTK6 + Qt6(仅 DTK6 单版本,集中精力冲方向三)
构建 CMake
GPU 数据 QThreadPool 后台异步调 nvidia-smi --query-gpu=...,结果回主线程缓存(不阻塞 UI)
进程数据 /proc/[pid](Linux 原生,无 psutil)
主题 DPalette + DGuiApplicationHelper::setPaletteType + DBus 监听 org.deepin.dde.Appearance1.Changed
进度控件 DProgressBar(实测比 DCircleProgress 紧凑)
单实例 DApplication::setSingleInstance("deskmon")
窗口 DWidget + DBlurEffectWidget 悬浮窗(磨砂 + 圆角 + AutoColor 遮罩)+ QStackedLayout 双模式切换
通知 DUtil::DNotifySender(无边框悬浮窗场景比 DFloatingMessage 可靠)

基于 deepin Skill 的开发过程

本作品全程借助 deepin Skills 仓库的 dtk-development 模块完成(仓库共 4 个 Skill,本作品是应用非插件,仅使用该模块)。

实际调用并落地到代码的 references 文档

Skill 引用文档 用于 代码位置
widgets/application.md DApplication 入口、单实例、newInstanceStarted 激活 main.cpp:62-89
widgets/window.md 主悬浮窗选型DWidget monitorwidget.h:29-33
widgets/blur-effect.md DBlurEffectWidget 磨砂+圆角、AutoColor 跟随主题、迷你模式圆角切换 monitorwidget.cpp:130-138、522-527
widgets/progress.md DProgressBar 紧凑指标条 metricrow.cpp:51
widgets/dialog.md DDialog 设置/GPU/进程对话框 settings_dialog.cpp:20-31
widgets/view.md DTableWidget 进程/显存表 gpu_dialog.h:8-38
theme/palette.md DPalette::Highlight 派生指标配色 themecolors.cpp:11-14
theme/theme-switch.md themeTypeChanged 联动刷新 monitorwidget.cpp:97
utilities/gui-helper.md setPaletteType(DarkType/LightType) 主动同步 main.cpp:32-36
utilities/dbus.md 监听Appearance1.Changed 补 GlobalTheme 跟随 main.cpp:18-86
utilities/desktop-services.md DNotifySender 番茄钟/阈值告警通知 pomodoro.cpp:194monitorwidget.cpp:696
app-dev-with-dtk.md CMake 工程 +debian/control 模板 CMakeLists.txt:17-20
dtksrc-compile-debug.md 工具链断链重定向、DLogManager 破坏事件循环定位 见下方踩坑节

安装

# 安装(apt 会自动按 Recommends 拉装 nvidia-smi,无 N 卡也正常装)
sudo apt install ./deskmon_1.0.2_amd64.deb

# 卸载(保留 ~/.config/deskmon 用户配置)
sudo apt remove deskmon

包元数据:

  • Installed-Size: 389 KBdpkg-gencontrol 自动计算)
  • Recommends: nvidia-smi(软依赖,无 N 卡用户也能安装,启动时自动降级隐藏 GPU 面板)
  • 依赖由 dh_shlibdeps 自动生成(libdtk6*libqt6*

查看安装大小:dpkg -l deskmonapt show deskmon | grep Installed-Size

源码构建

# 本机工具链在自定义前缀(Qt 6.8.0 + DTK6 6.7.44),标准系统包环境下可省略 CMAKE_PREFIX_PATH
cmake -S . -B build -DCMAKE_PREFIX_PATH="$HOME/jm-prefix/usr" -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j"$(nproc)"

# 或用快速启动脚本(build/run/clean 三模式)
./start.sh            # 增量编译后启动
./start.sh clean      # 清理后全量编译并启动

# deb 打包
dpkg-buildpackage -b -us -uc -d
mkdir -p dist && cp ../deskmon_*.deb dist/

仓库

开源仓库地址:Gitee - yngeek/deskmon

许可证:GPL-2.0

适用环境

  • deepin / UOS / DDE 桌面环境
  • DTK6 + Qt6 运行时
  • Linux x86_64

致谢:感谢 deepin 社区的 dtk-development Skill 文档,让一个 PyQt5 老项目能顺利迁移成原生 DTK6 应用。希望这个工具对大家有用,欢迎 issue / PR / 星标 ✨

注:因token有限,使用了几个API模型.

  • 商汤日日新免费API模型SenseNova 6.7 Flash Lite根据资料出方案 ( 原想着省点token,其实用更强的模型效果要更好 );
  • 用订阅的glm-5.2模型审核方案并修复完善;
  • 用deepseek-v4-flash 写代码;
  • 最后用kimi-k2.7-code 优化UI,glm-5.2模型审核代码并修复问题。

编程代理工具: 智谱Zcode v3.7.5


编程过程期间截图:

02222.png

000222222.png

注:

AMD64架构的deb包在开源项目的发行版页面,龙芯版的deb包首次尝试构建,在本帖7楼可下载试用。

Reply Favorite View the author
All Replies
avatar
骑🐖追帅哥bot
Moderator
2026-08-11 13:22
#1

企业微信截图_20260811132152.png

Reply View the author
avatar
kookboy
deepin
2026-08-11 13:46
#2

当前token紧张,心中还有个想法让它能以透明浮动条的形式呈现。等缓一下,继续迭代。


今天,因高峰时段,模型时常断连,token也差不多用完了。。。。。。

还好,终于迭代完成,功能基本完成了。shamed

Reply View the author
avatar
晚秋(lateautumn)
Moderator
2026-08-11 15:23
#3

这个很需要,大佬厉害applaud

Reply View the author
avatar
kookboy
deepin
2026-08-11 17:15
#4
晚秋(lateautumn)

这个很需要,大佬厉害applaud

可惜,因硬件条件限制,程序只支持AMD64位的cpu架构。如果你会用AI工具,可以通过源码自己构建。

Reply View the author
avatar
qq4945286
deepin
2026-08-11 23:31
#5

001.png

只是我用ai做的,感觉这样任务栏比原始的要谐调些

Reply View the author
avatar
kookboy
deepin
2026-08-12 12:48
#6
qq4945286

001.png

只是我用ai做的,感觉这样任务栏比原始的要谐调些

你的这个也挺不错~简洁

Reply View the author
avatar
kookboy
deepin
12 hours ago
#7
晚秋(lateautumn)

这个很需要,大佬厉害applaud

龙芯版的我构建了一个,你试试看。

下载解压后安装:deskmon_1.0.3_loong64.deb.zip

Reply View the author
avatar
晚秋(lateautumn)
Moderator
10 hours ago
#8
kookboy

龙芯版的我构建了一个,你试试看。

下载解压后安装:deskmon_1.0.3_loong64.deb.zip

好的,回单位时测试一下。谢谢applaud

Reply View the author