# ukui-monitor-overlay **Repository Path**: fensl/ukui-monitor-overlay ## Basic Information - **Project Name**: ukui-monitor-overlay - **Description**: UKUI Monitor Overlay 是一款专为 UKUI 桌面环境设计的轻量级系统监控悬浮窗工具 - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: https://gitee.com/openkylin/ukui-monitor-overlay - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2025-05-29 - **Last Updated**: 2025-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## UKUI Monitor Overlay ### 介绍 UKUI Monitor Overlay 是一款专为 UKUI 桌面环境设计的轻量级系统监控悬浮窗工具,能够实时显示硬件状态信息并始终悬浮于桌面最上层。本工具采用模块化设计,支持多种硬件监控和功能扩展,目前正处于积极开发阶段! 截图待补充! ### 安装和运行 待补充! ### TODO 以下是计划和正在实现的功能,欢迎在issue中提出你的想法和建议! - [x] 监测 CPU 占用率 - [x] 监测 CPU 频率 - [x] 监测内存占用率 - [ ] 监测网络上行和下行状态 - [x] 监测 GPU 占用率,显存占用率,温度,核心频率 - [x] NVIDIA GPU 完全支持 - [x] AMD GPU 完全支持 - [ ] Intel GPU 计划支持(显存占用暂时无解) - [ ] PowerVR GPU 暂未找到实现方案 - [ ] Mali GPU 暂未找到实现方案 - [ ] MTT GPU 暂未找到实现方案 - [ ] 设置面板 - [x] 支持自定义显示项 - [ ] 支持自定义显示覆盖窗口透明度 - [ ] 支持自定义显示覆盖窗口位置 - [x] 支持调整字体大小 - [x] 支持调整字体颜色 - [ ] 支持调整背景透明度 - [ ] 支持调整背景颜色 - [ ] 支持恢复默认设置 - [x] 支持自定义监视器插件 - [x] 监视器窗口始终置顶显示 - [x] 在x11下支持窗口置顶显示 - [x] 在wlcom(Wayland)下支持窗口置顶显示 - [x] 监视器窗口可拖动 - [ ] 添加系统托盘图标 - [ ] 添加i18n支持 - [x] 添加中文支持 - [ ] 添加英文支持 - [ ] 添加繁体中文支持 - [ ] 跟随UKUI主题切换 - [ ] 添加桌面环境图标 - [ ] 添加开机启动项 ### 编译 终端执行: ```bash mkdir build cd build cmake .. make ``` 安装: ```bash sudo make install ``` Qt Creator: 打开工程,并配置构建套件 ### 打包 ```bash cd ukui-monitor-overlay debmake debuild ``` ### 设置 设置文件路径: ``` /home/用户名/.config/ukui-monitor-overlay/settings.conf ``` ### 兼容性 - openKylin 2.0 (nile) - openKylin 3.0 (huanghe) ### 开发 #### 安装依赖 ```bash sudo apt install build-essential cmake # 安装编译工具 sudo apt install libkysdk-hardware libkysdk-hardware-dev # 安装openKylin 硬件 SDK sudo apt install nvidia-utils-570 # 安装nvidia驱动一般会自带 sudo apt install libkysdk-qtwidgets libkysdk-qtwidgets-dev # 安装openKylin Qt控件 SDK sudo apt install libkysdk-waylandhelper libkysdk-waylandhelper-dev libkf5windowsystem-dev # 安装openKylin Wayland SDK ``` OpenSDK问题: 在获取GPU信息遇到如下报错: ``` The name com.kylin.kysdk.service was not provided by any .service files ``` 需要安装: ```bash sudo apt install libkysdk-system-dbus systemctl status kysdk-dbus.service systemctl enable kysdk-dbus.service ``` 应该有如下输出: ``` DSOE1024@DSOE1024-PC:~$ systemctl status kysdk-dbus.service ● kysdk-dbus.service - KYLIN SDK SYSTIME DBUS Loaded: loaded (/usr/lib/systemd/system/kysdk-dbus.service; enabled; preset: enabled) Active: active (running) since Thu 2025-05-29 14:57:24 CST; 4min 42s ago Main PID: 10738 (kySdkDbus) Tasks: 2 (limit: 37104) Memory: 2.6M (peak: 21.7M) CPU: 478ms CGroup: /system.slice/kysdk-dbus.service └─10738 /usr/bin/kySdkDbus 5月 29 14:57:24 DSOE1024-PC systemd[1]: Starting kysdk-dbus.service - KYLIN SDK SYSTIME DBUS... 5月 29 14:57:24 DSOE1024-PC systemd[1]: Started kysdk-dbus.service - KYLIN SDK S YSTIME DBUS. ``` #### 在指定核心上运行进程 设置了CPU亲和性,查看进程跑在哪个CPU上面: ```bash ps -o pid,psr,comm -p 82921 #填写具体的进程ID ``` #### GPU必要文件和命令 NVIDIA GPU驱动应该正确安装且能运行nvidia-smi命令: AMD GPU驱动默认在系统中,应该有以下文件: ```bash DSOE1024@DSOE1024-PC:/sys/class/drm/card0/device$ cat vendor 0x1002 DSOE1024@DSOE1024-PC:/sys/class/drm/card0/device$ cat gpu_busy_percent 0 DSOE1024@DSOE1024-PC:/sys/class/drm/card0/device$ cat mem_info_vram_total 536870912 DSOE1024@DSOE1024-PC:/sys/class/drm/card0/device$ cat mem_info_vram_used 24862720 ``` Intel GPU驱动应该有以下文件: ```bash cat /sys/class/drm/card0/gt_act_freq_mhz # GPU当前实际频率 cat /sys/class/drm/card0/gt_max_freq_mhz # GPU最大频率 ``` ### GPU监视器接口开发 没有支持的GPU欢迎提交PR!可以参考以下接口实现: ```cpp #ifndef GPUMONITORINTERFACE_H #define GPUMONITORINTERFACE_H /** * @brief GPU监视器接口,根据型号厂商具体实现 */ class GpuMonitorInterface{ public: /** * @brief 获取GPU核心占用 * @return 占用率,返回 -1 为获取失败 */ virtual double getGpuCoreUsage() = 0; /** * @brief 获取GPU内存占用 * @return 占用率,返回 -1 为获取失败 */ virtual double getGpuMemUsage() = 0; }; #endif // GPUMONITORINTERFACE_H ``` 以下是针对NVIDIA的GPU实现的示例,可以借助NVIDIA SMI获取需要的参数: ```cpp #ifndef NVGPUMONITOR_H #define NVGPUMONITOR_H #include class NVGpuMonitor : public GpuMonitorInterface { public: NVGpuMonitor(); ~NVGpuMonitor(); double getGpuCoreUsage() override; double getGpuMemUsage() override; }; #endif // NVGPUMONITOR_H ``` ```cpp #include "nvgpumonitor.h" #include NVGpuMonitor::NVGpuMonitor() { } NVGpuMonitor::~NVGpuMonitor() { } double NVGpuMonitor::getGpuCoreUsage() { QProcess process; process.start("nvidia-smi", {"--query-gpu=utilization.gpu", "--format=csv,noheader,nounits"}); process.waitForFinished(); QString usage_str = QString(process.readAllStandardOutput()); return usage_str.toDouble(); } double NVGpuMonitor::getGpuMemUsage() { QProcess process; process.start("nvidia-smi", {"--query-gpu=memory.used,memory.total", "--format=csv,noheader,nounits"}); process.waitForFinished(); QStringList parts = QString(process.readAllStandardOutput()).trimmed().split(','); if (parts.size() >= 2) { double used_mem = parts[0].trimmed().toDouble(); double total_mem = parts[1].trimmed().toDouble(); double usage = (used_mem / total_mem) * 100; return usage; } return 0; } ``` 不同的GPU可以参考尝试提供的文档实现,比如: MTT GPU参考:https://docs.mthreads.com/gmc/gmc-doc-online/user_manual 欢迎提交PR丰富我们的软件支持! ### 插件开发 为了支持更多的硬件设备,参考了UKUI Quick项目,实现了一个插件系统,可以方便地扩展支持更多的硬件设备(比如一些型号特殊的GPU设备,或者特殊的传感器设备),可以参考以下实现: 新建一个Cmake Qt5 C++ 动态库 工程: ```cmake cmake_minimum_required(VERSION 3.14) set(PROJECT_NAME ukui-monitor-testplugin) project(${PROJECT_NAME} LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED) add_library(${PROJECT_NAME} SHARED DiskTestPlugin_global.h ukui_monitor_testplugin.cpp ukui_monitor_testplugin.h ../../include/systeminfoplugininterface.h # 确保同步 ) target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Core) target_compile_definitions(${PROJECT_NAME} PRIVATE DISKTESTPLUGIN_LIBRARY) ``` systeminfoplugininterface.h 接口定义: ```cpp #ifndef SYSTEMINFOPLUGININTERFACE_H #define SYSTEMINFOPLUGININTERFACE_H #define PluginInterfaceIID "com.ukui-monitor-overlay.SystemInfoPluginInterface/1.0" #include #include #include /** * @brief 系统信息接口 */ class SystemInfoPluginInterface : public QObject { Q_OBJECT public: virtual ~SystemInfoPluginInterface() {} /** * @brief 获取插件名称 * @return */ virtual QString name() const = 0; /** * @brief 插件显示名称,用于显示在监视器面板上 * @return */ virtual QString displayName() const = 0; /** * @brief 获取插件描述 * @return */ virtual QString description() const = 0; /** * @brief 获取插件作者(可选) * @return */ virtual QString author() const { return QString(); } /** * @brief 获取信息 * @return */ virtual QVariant getMonitoringValue() const = 0; }; Q_DECLARE_INTERFACE(SystemInfoPluginInterface, PluginInterfaceIID) #endif // SYSTEMINFOPLUGININTERFACE_H ``` 新建插件类,继承自SystemInfoPluginInterface,实现以下接口: ```cpp #ifndef DISKTESTPLUGIN_H #define DISKTESTPLUGIN_H #include #include <../../include/systeminfoplugininterface.h> class DISKTESTPLUGIN_EXPORT UKUIMonitorTestPlugin : public SystemInfoPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID PluginInterfaceIID) Q_INTERFACES(SystemInfoPluginInterface) public: explicit UKUIMonitorTestPlugin(); ~UKUIMonitorTestPlugin() override; QString name() const override; QString displayName() const override; QString description() const override; QString author() const override; QVariant getMonitoringValue() const override; }; #endif // DISKTESTPLUGIN_H ``` 实现类成员函数: ```cpp #include #include #include #include #include UKUIMonitorTestPlugin::UKUIMonitorTestPlugin() { qDebug() << "Hello From UKUIMonitorTestPlugin"; } UKUIMonitorTestPlugin::~UKUIMonitorTestPlugin() { } QString UKUIMonitorTestPlugin::name() const { return "XXX温度插件"; } QString UKUIMonitorTestPlugin::displayName() const { return "XXX温度"; } QString UKUIMonitorTestPlugin::description() const { return "该插件用于获取XXX的温度"; } QString UKUIMonitorTestPlugin::author() const { return "DSOE1024"; } QVariant UKUIMonitorTestPlugin::getMonitoringValue() const { // 生成 2 位随机数(10 ~ 99) int min = static_cast(std::pow(10, 1)); // 10 int max = static_cast(std::pow(10, 2)) - 1; // 99 std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> distrib(min, max); QString tep = QString::number(distrib(gen)); return tep; } ``` 尝试编译,如果成功,会在build目录下生成一个.so文件,欢迎在openKylin论坛和Gitee仓库分发! *注意,该项目迭代中,插件系统可能还在调整,请参考最新的方法实现。* ### 维护者 - [DSOE1024 - computerlub@163.com](https://gitee.com/DSOE1024) ### 特别感谢 感谢 [chipo](https://gitee.com/chipo) 和 [gitealinux](https://gitee.com/gitealinux) 协助验证和测试! ### LICENSE 本项目遵循 GPLv3 开源协议,请详见 LICENSE 文件。 考虑到部分硬件厂商可能存在SDK代码授权限制,项目中涉及的插件接口头文件(systeminfoplugininterface.h)允许以 LGPLv3 协议发布。该接口仅用于定义插件规范,其具体实现部分代码可根据实际情况选择是否开源。对于涉及特定硬件授权的插件实现代码,可保持闭源形式发布(也就是仅提供so库)。