我使用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";
}
真诚地感谢您的回答!
答案 0 :(得分:2)
使用广泛而有用的Qt Event System。这样,您就可以在Windows和Linux上使用相同的代码。
我建议您在应用中添加eventFilter
。如果根据您的要求捕获的事件为QEvent::KeyPress
或QEvent::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);
}
还可以通过在QApplication
或QCoreApplication
对象上安装事件过滤器来过滤整个应用程序的所有事件。您可以从我在第一行提供的文档链接中阅读更多内容。
如果必须重用事件过滤器,我建议添加一个继承自QObject
的虚拟类。在本课程中,您只需实现函数eventFilter
即可。您现在可以将此类的实例传递给函数installEventFilter
,并使用SIGNALS与其他对象进行通信。
编辑:
如果您希望在应用程序之外捕获事件,Qt本身也不支持(尚未)。但您可以使用Qxt库,使用QxtGlobalShortcut类添加对它的支持。