[英]How to pass X11 events to QDialog
目前,我正在尝试将系统X11事件(在Linux上)传递给我创建的对象。 为此,我从QApplication向我的对象安装了一个eventFilter。 这是有效的,因为它获取应用程序的所有事件。 但是我也需要传递对象X11事件。
我继续在我的对象中创建了一个x11Event,希望它能从X11接收事件,但事实并非如此。
反正有没有将X11事件直接传递给我的应用程序内的对象?
您可以通过以下方式接收XEvent
:
QAbstractEventDispatcher::instance()->setEventFilter()
设置的过滤器函数,它将接收所有XEvent
。 qApp->setEventFilter()
设置的过滤器函数,它只接收针对应用程序的事件。 QApplication::x11EventFilter
QWidget::x11Event
(子窗口小部件不接收XEvent
)。 以该顺序。 如果这些函数中的任何一个对任何事件都返回true
,则下一个函数将不会收到该事件。
某些事件也可以通过Qt在这些函数之间进行过滤,例如QWidget::x11Event
不接收XKeyEvent
(它们由具有键盘焦点的小部件的QInputContext::x11FilterEvent
函数过滤)。
有关更多详细信息,您应该查看Qt源: QEventDispatcher_x11.cpp和QApplication::x11ProcessEvent
的函数QApplication::x11ProcessEvent
因此,在大多数情况下,如果仅在QDialog
派生类中重新实现x11Event
函数,则应该已经接收到大多数XEvent
。 如果您希望您的子窗口小部件也接收它们,您可以从重新实现QDialog::x11Event
手动调用它们的x11Event
函数。
我现在没有我的开发机器,请原谅我的语法。 我会做以下事情:
将XEvent *声明为元类型:
int main() { qRegisterMetatype<XEvent*>(); }
重新实现QApplication::x11EventFilter
如alexisdm建议的那样
在QApplication重新实现中创建一个信号,例如:
void dialogEvent(XEvent*);
与应用程序中的任何位置相比,您可以执行以下操作:
QApplication *inst = QApllication::instance();
MyApplication *myApp = qobject_cast<MyApplication*>(inst);
if(myApp!= 0){
connect(myApp, SIGNAL(dialogEvent(XEvent*), myDialog, SLOT(onXEvent(XEvent*));
}
这样您就可以全局访问x11事件。 作为替代方案,您可以随时重新实现:
bool QWidget::x11Event ( XEvent * event )
对于个人小部件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.