繁体   English   中英

如何将X11事件传递给QDialog

[英]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.cppQApplication::x11ProcessEvent的函数QApplication::x11ProcessEvent

因此,在大多数情况下,如果仅在QDialog派生类中重新实现x11Event函数,则应该已经接收到大多数XEvent 如果您希望您的子窗口小部件也接收它们,您可以从重新实现QDialog::x11Event手动调用它们的x11Event函数。

我现在没有我的开发机器,请原谅我的语法。 我会做以下事情:

  1. 将XEvent *声明为元类型:

    int main() { qRegisterMetatype<XEvent*>(); }

  2. 重新实现QApplication::x11EventFilter如alexisdm建议的那样

  3. 在QApplication重新实现中创建一个信号,例如:

    void dialogEvent(XEvent*);

  4. 与应用程序中的任何位置相比,您可以执行以下操作:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM