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

Qt中是否有API或方法可实现无用户操作指定时长后让设备进入睡眠模式

Qt Linux平台无用户交互自动熄屏实现方案

Qt本身没有提供跨平台的直接API直接实现该需求,Linux平台下可以结合Qt的能力+系统原生接口实现,常用两种方案如下:


方案1:自主监听用户闲置状态+调用系统DPMS接口实现

  • 闲置状态监听分两种场景:如果只需要监听你的应用运行时的用户交互,可直接重写QApplication::notify方法捕获所有鼠标、键盘、触摸类交互事件;如果需要监听全系统的用户闲置状态,可直接调用X11的XScreenSaver相关接口直接获取系统级闲置时长,结果更准确。
  • 计时逻辑用QTimer实现,每次检测到用户交互就重置计时器,计时器超时后执行熄屏操作即可。
  • Linux下熄屏可以直接调用DPMS(显示电源管理)相关命令/接口,最简便的方式是调用xset dpms force off命令直接关屏,需要唤醒时执行xset dpms force on即可。

示例代码片段

// 重写QApplication的notify方法捕获应用内交互事件
bool MyApplication::notify(QObject *obj, QEvent *event)
{
    // 筛选用户交互类事件
    if (event->type() == QEvent::MouseButtonPress || 
        event->type() == QEvent::MouseMove ||
        event->type() == QEvent::KeyPress ||
        event->type() == QEvent::KeyRelease ||
        event->type() == QEvent::Wheel ||
        event->type() == QEvent::TouchBegin ||
        event->type() == QEvent::TouchUpdate) {
        // 有交互,重置倒计时器
        m_idleTimer->start();
    }
    return QApplication::notify(obj, event);
}

// 超时槽函数,执行熄屏
void onIdleTimeout()
{
    system("xset dpms force off");
}

如需获取系统全局闲置时间,可调用X11接口实现,示例如下:

#include <X11/extensions/scrnsaver.h>

unsigned long getSysIdleTime()
{
    Display *dpy = XOpenDisplay(NULL);
    XScreenSaverInfo *info = XScreenSaverAllocInfo();
    XScreenSaverQueryInfo(dpy, DefaultRootWindow(dpy), info);
    unsigned long idleMs = info->idle;
    XFree(info);
    XCloseDisplay(dpy);
    return idleMs; // 返回值单位为毫秒
}

你可以启动一个间隔1秒的定时器,定期调用上述接口判断闲置时长,达到预设阈值后触发熄屏即可。


方案2:修改系统原生电源管理配置

如果你的应用有权限修改系统配置,可以直接调用桌面环境对应的配置接口调整系统自动熄屏时长,无需自主监听事件,比如GNOME桌面下执行命令gsettings set org.gnome.desktop.session idle-delay 300即可将系统自动熄屏时长设为300秒(5分钟),到时间系统会自动执行熄屏逻辑,适合定制化系统场景使用。

  • 注意事项:
  • DPMS相关操作需要当前用户有X11访问权限,远程执行需要提前设置DISPLAY环境变量。
  • 如果你使用的是Wayland桌面,X11相关接口不生效,需要调用对应桌面环境的DBus接口操作熄屏。

内容的提问来源于stack exchange,提问作者Manoj Tiwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:45:03