Quickshell电池状态组件无法更新问题求助
解决Quickshell电池组件始终显示0%的问题
问题背景
在CachyOS Hyprland环境下使用Quickshell,已成功实现时钟、工作区切换器和蓝牙菜单,但电池状态组件一直显示0%。已确认upower守护进程已启用并启动,且电池设备路径/org/freedesktop/UPower/devices/battery_BAT0正确。
原代码
import QtQuick import Quickshell Text { id: battery property int percentage: 0 property bool charging: false font.family: "0xProto Nerd Font Mono" font.pixelSize: 12 color: Theme.active text: charging ? " " + percentage + "%" : percentage + "%" anchors.verticalCenter: parent.verticalCenter Component.onCompleted: { let device = DBus.createInterface( "org.freedesktop.UPower", "/org/freedesktop/UPower/devices/battery_BAT0", "org.freedesktop.UPower.Device" ) let props = DBus.createInterface( "org.freedesktop.UPower", "/org/freedesktop/UPower/devices/battery_BAT0", "org.freedesktop.DBus.Properties" ) function update() { props.Get("org.freedesktop.UPower.Device", "Percentage", function(v) { percentage = Math.round(v) }) props.Get("org.freedesktop.UPower.Device", "State", function(v) { charging = (v === 1) }) } update() props.PropertiesChanged.connect(function() { update() }) } }
问题分析与修复方案
1. 正确处理DBus Get方法的返回值
UPower的DBus Get方法返回的是变体类型的数组,原代码直接使用v会拿到整个数组对象,而非实际数值。需要提取数组中的第一个元素v[0]来获取电池百分比和状态值。
2. 优化PropertiesChanged信号处理
原代码每次收到属性变更信号时都重新调用Get方法获取所有属性,效率较低。可以直接利用信号传递的变更属性字典来更新值,同时避免重复调用DBus。
3. 添加错误排查逻辑
添加DBus调用的错误回调,方便排查调用失败的原因(比如权限、路径问题)。
修改后的代码
import QtQuick import Quickshell Text { id: battery property int percentage: 0 property bool charging: false font.family: "0xProto Nerd Font Mono" font.pixelSize: 12 color: Theme.active text: charging ? " " + percentage + "%" : percentage + "%" anchors.verticalCenter: parent.verticalCenter Component.onCompleted: { let props = DBus.createInterface( "org.freedesktop.UPower", "/org/freedesktop/UPower/devices/battery_BAT0", "org.freedesktop.DBus.Properties" ) // 初始化获取电池状态 function updateBattery() { // 获取电池百分比 props.Get("org.freedesktop.UPower.Device", "Percentage", function(v) { percentage = Math.round(v[0]); }, function(err) { console.log("获取电池百分比失败: " + err.message); }); // 获取充电状态 props.Get("org.freedesktop.UPower.Device", "State", function(v) { // UPower State枚举: 0=放电,1=充电,2=满电,3=空电 charging = (v[0] === 1); }, function(err) { console.log("获取充电状态失败: " + err.message); }); } updateBattery(); // 监听属性变更,仅更新变化的属性 props.PropertiesChanged.connect(function(interfaceName, changedProps) { if (changedProps.Percentage !== undefined) { percentage = Math.round(changedProps.Percentage[0]); } if (changedProps.State !== undefined) { charging = (changedProps.State[0] === 1); } }); } }
额外验证步骤
- 执行
upower -i /org/freedesktop/UPower/devices/battery_BAT0命令,确认终端能正确输出电池百分比和状态,验证UPower工作正常。 - 检查Quickshell是否有访问UPower DBus接口的权限,通常普通用户默认有权限,若存在权限问题可通过Polkit配置调整。
内容的提问来源于stack exchange,提问作者Hotsauce
相关产品推荐
相关产品推荐

