GSettings(四)——dconf-WARNING: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11

        dconf-WARNING: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY 错误通常出现在尝试在没有图形界面的环境中使用 D-Bus 或 GSettings 时。这是因为这些配置工具依赖于会话总线,而会话总线通常需要在图形界面下运行。你的程序无法正确连接到 D-Bus 会话总线,因此无法设置 GSettings 的键值。D-Bus 会话总线是 GSettings 操作的基础,如果无法连接,就无法进行设置。

解决方法

1. 确保在图形界面下运行

        如果你在一个没有图形界面的环境中运行(例如远程服务器或仅有终端的环境),你可以通过 SSH 的 X11 转发功能运行:

  ssh -X user@remote-host

        这将会转发 X11 显示,使得 D-Bus 可以正常工作。

2. 设置 DBUS_SESSION_BUS_ADDRESS 环境变量

        确保在运行程序时设置了 DBUS_SESSION_BUS_ADDRESS 环境变量。在有图形界面的会话中可以使用以下命令获取会话总线地址并在无图形界面的环境中设置:

# 在图形界面下的普通用户会话中运行
echo $DBUS_SESSION_BUS_ADDRESS

# 记下输出的地址,例如:
# unix:path=/run/user/1000/bus

# 在无图形界面的环境中运行前设置环境变量
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

# 运行程序
./your_program

3. 使用 dbus-launch 启动 D-Bus 会话

        如果没有会话总线,你可以使用 dbus-launch 来启动一个新的 D-Bus 会话:

eval `dbus-launch --sh-syntax` export DBUS_SESSION_BUS_ADDRESS export DBUS_SESSION_BUS_PID

        然后再运行你的程序:

        ./your_program

4. 在 CMakeLists.txt 中添加库依赖

        确保在你的 CMakeLists.txt 中正确添加对 GSettings 的库依赖:

find_package(Qt5Core REQUIRED) find_package(PkgConfig REQUIRED) pkg_check_modules(GSETTINGS REQUIRED gio-2.0) include_directories(${GSETTINGS_INCLUDE_DIRS}) link_directories(${GSETTINGS_LIBRARY_DIRS}) add_executable(your_app main.cpp) target_link_libraries(your_app Qt5::Core ${GSETTINGS_LIBRARIES})

        修正后的代码

        确保初始化 QGSettings 指针并检查是否成功:

#include <QGSettings>
#include <QDebug>

void setGsetting()
{
    const QString schemaId = "com.test.datetime";
    QGSettings *m_gsettings = nullptr; // 确保指针初始化

    if (m_gsettings) {
        qDebug() << "QGSettings already initialized.";
        return;
    }

    if (QGSettings::isSchemaInstalled(schemaId.toUtf8().constData())) {
        qDebug() << "QGSettings initialized for schema: " << schemaId;
        m_gsettings = new QGSettings(schemaId, nullptr); // 实例化 QGSettings
    } else {
        qDebug() << "Schema not installed: " << schemaId;
        return;
    }

    if (m_gsettings->isWritable("timeformat")) {
        m_gsettings->set("timeformat", "12 小时");
    } else {
        qDebug() << "Key 'timeformat' is not writable";
    }

    delete m_gsettings; // 释放资源
}

总结

        通过确保正确设置 DBUS_SESSION_BUS_ADDRESS 环境变量,或者使用 dbus-launch 启动 D-Bus 会话,你可以避免 dconf-WARNING: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY 错误。在图形界面环境下运行或正确转发 X11 也是解决此问题的有效方法。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值