在ubuntu系统中,如何让其按下物理关机键时,系统不处理,但qt程序能检测到关机键按下的事件,并处理信号

要让 Ubuntu 系统在按下物理关机键时,系统不直接处理该事件,但让你的 Qt 程序能够检测到并处理关机键的按下事件,可以参考以下步骤:

1. 禁用系统对关机键的默认处理

Ubuntu 系统默认会捕获电源键的按下事件并执行关机操作。首先你需要禁用系统对该事件的默认响应:

打开文件 /etc/systemd/logind.conf:

找到(或添加)以下行,并将默认的 poweroff 改为 ignore:

bash 复制代码
HandlePowerKey=ignore

保存文件并退出编辑器。

2. 在 Qt 程序中捕获电源键事件

在禁用了系统对关机键的默认响应后,你可以在 Qt 程序中捕获电源键的事件。

Qt 本身不直接提供对硬件电源键事件的监听,但你可以通过监听 Linux 输入设备(如 /dev/input/event*)来捕获按键事件。使用 evdev 或其他低级别的输入事件库可以帮助你监听这些硬件事件。

一个常见的方案是使用 libevdev 库来读取设备事件。以下是集成步骤的简要说明:

2.1 安装依赖库

确保安装了 libevdev 库:

bash 复制代码
sudo apt-get install libevdev-dev

2.2 Qt 程序中使用 libevdev 监听电源键

你可以在 Qt 程序中通过 libevdev 来监听事件。以下是一个基本示例代码:

cpp 复制代码
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include <libevdev/libevdev.h>
#include <fcntl.h>

class PowerKeyListener : public QThread {
    Q_OBJECT
public:
    void run() override {
        struct libevdev *dev = NULL;
        int fd = open("/dev/input/event0", O_RDONLY|O_NONBLOCK);  // 替换为电源键的事件文件
        if (fd < 0) {
            qWarning() << "无法打开设备文件";
            return;
        }

        int rc = libevdev_new_from_fd(fd, &dev);
        if (rc < 0) {
            qWarning() << "初始化 libevdev 失败";
            return;
        }

        qDebug() << "设备名:" << libevdev_get_name(dev);

        while (true) {
            struct input_event ev;
            rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
            if (rc == 0 && ev.type == EV_KEY && ev.code == KEY_POWER) {
                if (ev.value == 1) {
                    emit powerKeyPressed();
                }
            }
            QThread::msleep(50);  // 降低轮询频率
        }

        libevdev_free(dev);
        close(fd);
    }

signals:
    void powerKeyPressed();
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    PowerKeyListener listener;
    QObject::connect(&listener, &PowerKeyListener::powerKeyPressed, [](){
        qDebug() << "电源键按下!";
    });

    listener.start();

    return a.exec();
}

2.3 确定电源键设备文件

不同设备的电源键事件文件可能不同,通常位于 /dev/input/event*。你可以使用 evtest 工具来找到电源键对应的事件文件:

安装 evtest:

bash 复制代码
sudo apt-get install evtest

运行 evtest 并选择电源键设备:

bash 复制代码
sudo evtest

观察哪个 /dev/input/eventX 文件与电源键按下对应,然后将此文件路径应用到你的 Qt 程序中。

相关推荐
技术路上的探险家几秒前
Ubuntu下Docker与NVIDIA Container Toolkit完整安装教程(含国内源适配)
linux·ubuntu·docker
代码AC不AC4 分钟前
【Linux】深入理解缓冲区
linux·缓冲区·标准错误
Doro再努力8 分钟前
【Linux操作系统12】Git版本控制与GDB调试:从入门到实践
linux·运维·服务器·git·vim
Lsir10110_27 分钟前
【Linux】进程信号(上半)
linux·运维·服务器
开开心心就好1 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
无证驾驶梁嗖嗖1 小时前
用Plex打造随身私人影院告别影音杂乱,必须加上cpolar突破地域限制!
ubuntu
stevenson_aspdotnet1 小时前
QT5.15.12 编译备忘
qt
予枫的编程笔记2 小时前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun2 小时前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__2 小时前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360