Skip to content

UniDeskExpr 类型

表达式引擎单例,支持在文本中通过 %变量 语法引用系统数据,以及通过 %{数学表达式} 语法进行数值计算。所有文本类控件(如 UDCText)在渲染前都会调用 convertStr() 处理文本内容。

项目说明
控件类型全局单例(QML_SINGLETON)
源文件UniDesk/CppExt/UniDeskExpr.h / .cpp
继承QQuickItem
QML 导入import UniDesk 1.0

属性

readonly property SystemStats systemStats

缓存的系统统计数据,由内部定时器每秒更新一次。SystemStats 结构体包含以下成员:

  • cpu.usagePercent / cpu.temperature — CPU 使用率与温度
  • cpu.name / cpu.physicalCores / cpu.logicalCores / cpu.maxClockMHz — CPU 型号与规格
  • gpu.name / gpu.usagePercent / gpu.vramTotal / gpu.vramUsed / gpu.temperature — GPU 信息
  • mem.virtmemTotal / mem.virtmemUsed / mem.virtmemPercent — 物理内存
  • mem.swapmemTotal / mem.swapmemUsed / mem.swapmemPercent — 交换内存
  • net.bytesSend / net.bytesRecv — 累计网络流量
  • net.bytesSendPerSec / net.bytesRecvPerSec — 每秒网络速率
  • net.dropPercent — 丢包率
  • bat.batteryPercent / bat.charging / bat.remainMinutes — 电池信息
  • disk.totalSpace / disk.freeSpace / disk.usagePercent — 磁盘信息
  • sysInfo.uptimeSeconds / sysInfo.hostname / sysInfo.osName — 系统信息
  • sysInfo.screenWidth / sysInfo.screenHeight — 屏幕分辨率

方法

function convertStr(text, presets) → QString

解析文本中的所有 %变量%{数学表达式} 并替换为实际值。

替换优先级:

  1. 先用 QString::replace 直接替换所有 %变量(系统数据、日期时间等)
  2. 再用 exprtk 库求值 %{数学表达式} 块,支持 presets 中传入的自定义变量
qml
import UniDesk 1.0

// %变量替换
var result = UniDeskExpr.convertStr("CPU: %cpuPercent%")
// → "CPU: 23.5%"

// %{数学表达式}计算(内部引用系统变量仍需 % 前缀)
var result = UniDeskExpr.convertStr(
    "速度: %{%bytesRecvPerSec/1024} KB/s"
)
// → "速度: 512.5 KB/s"

// 通过presets传入自定义变量(无需 % 前缀)
var result = UniDeskExpr.convertStr(
    "总量: %{a + b}",
    { "a": 10, "b": 20 }
)
// → "总量: 30"

function evalResponse(response, expression) → QVariant

解析 API 响应(JSON 字符串)并在 response 全局对象上下文中执行 JS 表达式,支持字典与列表访问。

qml
var value = UniDeskExpr.evalResponse(
    '{"temp": 26.5, "weather": {"city": "北京"}}',
    "weather.city"
)
// → "北京"

function stopTimer()

停止内部数据刷新定时器(通常在应用退出时调用)。

%变量 替换表

所有 %变量 均使用 QString::replace 直接匹配替换,按以下顺序依次执行,先匹配先生效。

CPU

变量说明类型
%cpuPercentCPU 使用率double (%)
%cpuTempCPU 温度double (°C)
%cpuNameCPU 型号名称string
%cpuCoresCPU 逻辑核心数(线程数)int
%cpuMaxClockCPU 最大主频double (MHz)

GPU

变量说明类型
%gpuUsagePercentGPU 使用率double (%)
%gpuVramTotalGPU 显存总大小uint64 (字节)
%gpuVramUsedGPU 已用显存uint64 (字节)
%gpuTempGPU 温度double (°C)
%gpuNameGPU 型号名称string

内存

变量说明类型
%virtmemTotal总物理内存uint64 (字节)
%virtmemUsed已用物理内存uint64 (字节)
%virtmemPercent物理内存使用率double (%)
%swapmemTotal总交换内存uint64 (字节)
%swapmemUsed已用交换内存uint64 (字节)
%swapmemPercent交换内存使用率double (%)

网络

变量说明类型
%bytesSendTotal累计发送字节数uint64
%bytesRecvTotal累计接收字节数uint64
%bytesSendPerSec每秒发送字节数uint64
%bytesRecvPerSec每秒接收字节数uint64
%dropPercent丢包率double (%)

电池

变量说明类型
%bpercent电池百分比int
%bplug是否正在充电 (1/0)int
%bleftdays剩余天数(充电时显示 UNLIMITED)string
%blefthours剩余小时数(充电时显示 UNLIMITED)string
%bleftmins剩余分钟数(充电时显示 UNLIMITED)string
%blefthoursr剩余小时数(不含天数)string
%bleftminsr剩余分钟数(不含小时)string

磁盘

变量说明类型
%diskTotal系统盘总空间uint64 (字节)
%diskFree系统盘剩余空间uint64 (字节)
%diskPercent系统盘使用率double (%)

系统

变量说明类型
%uptime系统运行时间quint64 (秒)
%hostname主机名string
%osName操作系统名称string
%screenWidth主屏宽度int (像素)
%screenHeight主屏高度int (像素)

日期与时间

变量说明示例
%yyyy四位年份2026
%yy两位年份26
%MMMM月份全名August
%MMM月份缩写Aug
%MM两位月份08
%M月份8
%dddd星期全名Saturday
%ddd星期缩写Sat
%dd两位日期22
%d日期22
%HH两位小时(24h)14
%hh两位小时(12h)02
%H小时(24h)14
%h小时(12h)2
%mm两位分钟35
%m分钟35
%ss两位秒59
%s59
%ap小写上下午am / pm
%AP大写上下午AM / PM
%zzz三位毫秒123
%z毫秒123
%t时间戳1756878959

日历

变量说明类型
%isLeapYear是否闰年 (1/0)int
%yearDays今年天数int
%monthDays本月天数int
%dayOfYear一年中第几天int
%dayOfWeek一周中第几天(1=周一)int

%{数学表达式}

%{...} 内支持 exprtk 数学表达式语法。执行流程:

  1. 先替换文本中所有 %变量(包括 %{} 内部的)为实际数值
  2. 再对 %{...} 包裹的内容进行数学求值

因此在 %{} 内部引用系统变量时,仍需保留 % 前缀(如 %{%cpuPercent * 2})。

而通过 presets 传入的自定义变量不需要 % 前缀,直接使用变量名即可。

支持:

  • 算术运算:+ - * / ^
  • 数学函数:sin cos sqrt abs log exp min max
  • 比较运算:> < >= <= == !=
  • 括号嵌套
qml
// 单位换算(系统变量需 % 前缀,先替换再计算)
"%{%bytesRecvPerSec/1048576} MB/s"

// 百分比计算
"%{%virtmemUsed/%virtmemTotal*100}%"

// CPU 温度转华氏度
"%{%cpuTemp * 9 / 5 + 32}°F"

// GPU 显存使用率
"%{%gpuVramUsed / %gpuVramTotal * 100}%"

// 使用预设变量(无需 % 前缀)
UniDeskExpr.convertStr("%{price * count}", { "price": 9.9, "count": 3 })
// → "29.7"

// 混合使用
UniDeskExpr.convertStr("%{%cpuPercent + bonus}", { "bonus": 5 })
// → "28.5"

完整示例

qml
import UniDesk 1.0
import UniDesk.Controls 1.0

UDCText {
    textContent: "CPU: %cpuPercent%  GPU: %gpuUsagePercent%  内存: %virtmemPercent%"
}

UDCText {
    textContent: "CPU温度: %cpuTemp°C  GPU温度: %gpuTemp°C"
}

UDCText {
    textContent: "GPU: %gpuName  VRAM: %{%gpuVramUsed/1048576}MB"
}

UDCText {
    textContent: "网速: %{%bytesRecvPerSec/1048576} MB/s  磁盘: %diskPercent%"
}

UDCText {
    textContent: "%osName | %hostname | 运行: %uptime秒"
}

实现细节

  • 系统数据通过内部 1000ms(1 秒)定时器刷新。
  • % 变量使用 QString::replace 直接替换,不支持转义。如需显示字面 %,可以用两个连续的 %%%),引擎会先将其替换为内部占位符 [(*&*%^*$^%#%%^^&&*^*&(^))],处理完所有变量后再还原为 %
  • %{} 表达式支持括号嵌套,使用括号计数法找到匹配的右括号。
  • 未匹配的 %变量%{} 括号不匹配时,会原样保留。
  • %变量 替换在 %{} 求值之前执行,因此 %{} 内部的系统变量也会被替换为实际数值。
  • 温度变量在部分设备上可能返回 -1(不可用),建议在 UI 中做条件判断显示。

相关文档

遵循 CC BY-SA 4.0 协议开源文档。