# ukui-monitor-overlay
**Repository Path**: openkylin/ukui-monitor-overlay
## Basic Information
- **Project Name**: ukui-monitor-overlay
- **Description**: UKUI Monitor Overlay 是一款专为 UKUI 桌面环境设计的轻量级系统监控悬浮窗工具
- **Primary Language**: C++
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: https://gitee.com/openkylin/ukui-monitor-overlay
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 4
- **Created**: 2025-05-29
- **Last Updated**: 2026-04-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: UKUI, openKylin, Qt
## README
# UKUI Monitor Overlay
## 介绍
UKUI Monitor Overlay 是一款专为 openKylin 以及 UKUI 桌面环境设计的轻量级系统监控悬浮窗工具,具有以下特色:
- 实时显示硬件状态信息
- 悬浮窗始终显示在桌面最上层
- 支持多种硬件监控和功能扩展
- 支持自定义显示项、主题等
- 支持自定义监视器插件扩展,强大的可扩展性
## 快速开始
### 从源码编译安装
```bash
# 克隆仓库
git clone https://gitee.com/openkylin/ukui-monitor-overlay.git
cd ukui-monitor-overlay
# 编译
mkdir build && cd build
cmake ..
make
# 安装
sudo make install
```
### 开机自启动
默认会将`ukui-monitor-overlay.desktop`添加到`/etc/xdg/autostart/`,如果需要取消自启动请手动删除。
```bash
sudo rm -rf /etc/xdg/autostart/ukui-monitor-overlay.desktop
```
### 使用 Qt Creator 开发
1. 打开 Qt Creator
2. 导入项目
3. 配置构建套件
4. 构建并运行
### 卸载
可以通过apt卸载
```bash
sudo apt purge ukui-monitor-overlay
```
## 打包发布
```bash
cd ukui-monitor-overlay
debmake
debuild -us -uc -ui
```
## 配置设置
应用设置文件位于:
```
~/.config/ukui-monitor-overlay/settings.conf
```
建议在应用内通过设置面板进行调整。
## 系统兼容性
| 操作系统 | 版本 |
|---------|------|
| openKylin | 2.0 (nile) |
| openKylin | 3.0 (huanghe) |
## 功能路线图
### 已实现功能
- **CPU 监控** - 占用率、频率
- **内存监控** - 占用率
- **GPU 监控** - 占用率、显存、温度、频率
- NVIDIA GPU - 完全支持
- AMD GPU - 完全支持
- Intel GPU - 部分支持(核心占用)
- **界面定制** - 字体大小/颜色、背景颜色、显示项选择
- **窗口功能** - 置顶显示、可拖动、系统托盘
- **系统集成** - 桌面图标、开机启动
### 开发中功能
- **网络监控** - 上行/下行状态
- **GPU 支持扩展**
- PowerVR GPU - 实现中
- Mali GPU - 实现中
- **界面优化** - 背景透明度调整
- **国际化** - 多语言支持
## 开发指南
### 环境依赖
```bash
# 基础编译工具
sudo apt install build-essential cmake
# openKylin SDK(如果在openKylin平台编译)
sudo apt install libkysdk-hardware libkysdk-hardware-dev
sudo apt install libkysdk-qtwidgets libkysdk-qtwidgets-dev
sudo apt install libkysdk-waylandhelper libkysdk-waylandhelper-dev
sudo apt install libkf5windowsystem-dev
```
### openKylin OpenSDK 问题排查
如果遇到 GPU 信息获取错误:
```bash
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
```
正常输出应显示服务正在运行:
```
● kysdk-dbus.service - KYLIN SDK SYSTIME DBUS
Loaded: loaded (/usr/lib/systemd/system/kysdk-dbus.service; enabled)
Active: active (running)
```
### 进程监控
查看进程运行的 CPU 核心:
```bash
ps -o pid,psr,comm -p <进程ID>
```
### GPU 驱动要求
#### NVIDIA GPU
确保正确安装驱动并能运行 `nvidia-smi` 命令。
如果遇到以下问题,通常指向系统未能正确加载或与NVIDIA内核驱动程序通信:
```bash
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
```
可以尝试手动加载驱动模块并排查问题:
```bash
sudo modprobe nvidia
sudo modprobe nvidia_uvm
```
#### AMD GPU
验证以下系统文件存在:
```bash
cat /sys/class/drm/card0/device/vendor # 应显示 0x1002
cat /sys/class/drm/card0/device/gpu_busy_percent # GPU 使用率
cat /sys/class/drm/card0/device/mem_info_vram_* # 显存信息
```
#### 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 型号提供支持!参考以下接口实现:
### 基础接口定义
```cpp
#ifndef GPUMONITORINTERFACE_H
#define GPUMONITORINTERFACE_H
/**
* @brief GPU 监视器接口基类
*/
class GpuMonitorInterface {
public:
virtual ~GpuMonitorInterface() = default;
/**
* @brief 获取 GPU 核心占用率
* @return 占用率百分比,失败返回 -1
*/
virtual double getGpuCoreUsage() = 0;
/**
* @brief 获取 GPU 显存占用率
* @return 占用率百分比,失败返回 -1
*/
virtual double getGpuMemUsage() = 0;
};
#endif // GPUMONITORINTERFACE_H
```
### NVIDIA GPU 实现示例
```cpp
// nvgpumonitor.h
#ifndef NVGPUMONITOR_H
#define NVGPUMONITOR_H
#include "gpu_monitor_interface.h"
class NVGpuMonitor : public GpuMonitorInterface {
public:
NVGpuMonitor();
~NVGpuMonitor() override;
double getGpuCoreUsage() override;
double getGpuMemUsage() override;
};
#endif // NVGPUMONITOR_H
```
```cpp
// nvgpumonitor.cpp
#include "nvgpumonitor.h"
#include
double NVGpuMonitor::getGpuCoreUsage() {
QProcess process;
process.start("nvidia-smi", {
"--query-gpu=utilization.gpu",
"--format=csv,noheader,nounits"
});
process.waitForFinished();
QString output = process.readAllStandardOutput();
return output.trimmed().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 = parts[0].toDouble();
double total = parts[1].toDouble();
return (used / total) * 100;
}
return -1;
}
```
**欢迎提交 PR 来丰富我们的 GPU 支持!**
## 插件开发指南
### 插件系统概述
为了支持更多硬件设备,本项目参考 [UKUI Quick](https://gitee.com/openkylin/ukui-quick) 项目实现了一套插件系统,可以方便地扩展支持特殊硬件设备。
### 创建插件项目
#### CMake 配置
```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)
```
#### 插件接口定义
```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() = default;
// 插件基本信息
virtual QString name() const = 0; // 插件名称
virtual QString displayName() const = 0; // 显示名称
virtual QString description() const = 0; // 插件描述
virtual QString author() const { return QString(); } // 作者(可选)
// 监控功能
virtual QVariant getMonitoringValue() const = 0; // 获取监控值
};
Q_DECLARE_INTERFACE(SystemInfoPluginInterface, PluginInterfaceIID)
#endif // SYSTEMINFOPLUGININTERFACE_H
```
#### 插件实现示例
```cpp
// ukui_monitor_testplugin.h
#ifndef UKUI_MONITOR_TESTPLUGIN_H
#define UKUI_MONITOR_TESTPLUGIN_H
#include "systeminfoplugininterface.h"
class 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 // UKUI_MONITOR_TESTPLUGIN_H
```
```cpp
// ukui_monitor_testplugin.cpp
#include "ukui_monitor_testplugin.h"
#include
#include
#include
UKUIMonitorTestPlugin::UKUIMonitorTestPlugin() {
qDebug() << "测试插件已加载";
}
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 {
// 生成模拟温度数据 (10-99°C)
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> distrib(10, 99);
return QString::number(distrib(gen));
}
UKUIMonitorTestPlugin::~UKUIMonitorTestPlugin()
{
// 可以为空
}
```
### 插件分发与安装
1. **编译插件** - 成功编译后生成 `.so` 文件
2. **分发插件** - 可在 openKylin 论坛和源码仓库分发
3. **安装插件** - 复制到用户插件目录:
```bash
cp your-plugin.so ~/.local/share/monitor-overlay/plugins$
```
**注意**: 项目正在快速迭代中,插件系统可能调整,请参考最新文档。
## 项目维护
### 核心维护者
- **[DSOE1024](https://gitee.com/DSOE1024)** - computerlub@163.com
### 特别致谢
感谢以下贡献者的宝贵支持:
- [chipo](https://gitee.com/chipo) - 功能验证与测试
- [gitealinux](https://gitee.com/gitealinux) - 系统兼容性测试
## 许可证
本项目主要代码遵循 **GPLv3** 开源协议,详见 [LICENSE](LICENSE) 文件。
为了让“插件特殊条款”在法律和技术层面更加明确,同时兼顾硬件厂商 SDK 的授权限制,建议使用以下更规范的表述替换原有内容:
### 插件特殊条款
本项目的核心代码(不含插件部分)采用 **GPLv3** 许可证。为了允许开发者自由扩展硬件支持并兼容专有 SDK,特对插件相关代码作出如下例外规定:
- 插件开发者需自行承担使用专有 SDK 可能带来的合法性、可靠性、安全性等风险(如授权费、二次分发限制等)。
- 文件 `systeminfoplugininterface.h` 及其声明的接口类(`SystemInfoPluginInterface`)、宏(`PluginInterfaceIID`)等,**单独以 LGPLv3 许可证发布**。
- 基于该头文件开发的插件(无论闭源或开源)遵循以下条件:
- 必须**动态链接**到主程序,不得静态链接或以其他方式将 GPLv3 代码合并到插件中。
- 不得修改该头文件的内容并重新分发。
- 满足 LGPLv3 对调用接口的基本要求(即用户有能力替换该接口的实现,通常通过动态链接实现)。
- 插件中继承 `SystemInfoPluginInterface` 的具体实现类、辅助功能代码等,**可以选择任意许可证**(包括闭源、商业授权、GPL、MIT、Apache 等)。插件对应的源代码**无需公开**,可以完全私有。
- 插件可以仅以编译后的动态库(如 `.so` 文件)形式单独分发,无需附带源代码。
- 插件分发时须注明:
- 插件名称、版本、作者、适用平台。
- 所依赖的外部 SDK 及其授权条款(如果有)。
- 不包含主程序 GPLv3 代码的衍生部分(如直接复制主程序的非接口代码)。
- 对于必须调用厂商专有 SDK(例如不提供开源授权的 GPU 驱动库、硬件加速库等)才能获取监控数据的插件,**完全允许闭源并仅提供二进制形式**。