You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 09:50:55