如何使用Qt在linux平台上监听全局鼠标和键盘事件?

时间:2015-04-17 02:01:33

标签: qt mouseevent keyboard-events

我使用Qt开发我的应用程序,我想听全局鼠标和键盘事件,所以我可以在检测到这些事件后做些什么。在Windows平台上,我使用SetWindowsHookEx API。但我不知道如何在Linux上做类似的事情。

我在Windows上的代码如下:

/*********************listen mouse event*****************************/
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, NULL, 0);
if (mouseHook == NULL) {
qDebug() << "Mouse Hook Failed";
}
/*********************listen keyboard event*****************************/
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyBoardProc, NULL, 0);
if (keyboardHook == NULL) {
qDebug() << "Keyboard Hook Failed";
}

真诚地感谢您的回答!

1 个答案:

答案 0 :(得分:2)

使用广泛而有用的Qt Event System。这样,您就可以在Windows和Linux上使用相同的代码。

我建议您在应用中添加eventFilter。如果根据您的要求捕获的事件为QEvent::KeyPressQEvent::MouseButtonPress(或QEvent::MouseButtonDblClick),请采取必要的措施。

如果要在主窗口中为特定小部件应用事件过滤器,请在主窗口的构造函数中添加

ui->myWidget->installEventFilter(this);

现在您需要为主窗口实现受保护的方法eventFilter

在头文件中。

protected:
    bool eventFilter(QObject* obj, QEvent* event);

实施

bool MainWindow::eventFilter(QObject* obj, QEvent* event)
{
    if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent* keyEvent = static_cast<QKeyEvent *>(event);
        qDebug() << "Ate key press " << keyEvent->text();
        return true;
    }
    else if(event->type() == QEvent::MouseButtonPress)
    {
        qDebug() << "Mouse press detected";
        return true;
    }
    // standard event processing
    return QObject::eventFilter(obj, event);
}

还可以通过在QApplicationQCoreApplication对象上安装事件过滤器来过滤整个应用程序的所有事件。您可以从我在第一行提供的文档链接中阅读更多内容。

如果必须重用事件过滤器,我建议添加一个继承自QObject的虚拟类。在本课程中,您只需实现函数eventFilter即可。您现在可以将此类的实例传递给函数installEventFilter,并使用SIGNALS与其他对象进行通信。

编辑:

如果您希望在应用程序之外捕获事件,Qt本身也不支持(尚未)。但您可以使用Qxt库,使用QxtGlobalShortcut类添加对它的支持。