[英]Handle X11 events with Qt5
我正在将我的应用程序从 Qt4 移植到 Qt5。
据我所知,Qt5 不再支持处理 Xlib 事件并使用 XCB 事件(事件处理程序获取xcb_generic_event_t
对象)。 但是,我使用的spnav
库仅支持 X11 事件(它解析XEvent
对象以检索必要的信息)。 是否可以在 Qt5 中处理 X11 事件或将xcb_generic_event_t
转换为XEvent
?
在 Qt4 代码看起来像:
bool MyApplication::x11EventFilter(XEvent *event)
{
spnav_event sev;
spnav_x11_event(event,&sev);
if(sev.type == SPNAV_EVENT_MOTION)
{
emit joystickPositionEvent(sev.motion.x,sev.motion.y,sev.motion.z,sev.motion.rx,sev.motion.ry,sev.motion.rz);
}
else if(sev.type == SPNAV_EVENT_BUTTON)
{
emit joystickButtonEvent(sev.button.bnum,sev.button.press!=0);
}
return false;
}
如果其他人遇到同样的问题:spnav_x11_event() 只需要复制几个字段 - 这是我最终为 FreeCAD 编写的代码:
spnav_event navEvent;
// Qt4 used XEvents in native event filters, but Qt5 changed to XCB. The
// SpaceNavigator API only works with XEvent, so we need to construct a
// temporary XEvent with just enough information for spnav_x11_event()
auto xcb_ev(static_cast<const xcb_client_message_event_t *>(message));
if ((xcb_ev->response_type & 0x7F) == XCB_CLIENT_MESSAGE) {
XClientMessageEvent xev;
xev.type = ClientMessage;
xev.message_type = xcb_ev->type;
memcpy(xev.data.b, xcb_ev->data.data8, sizeof(xev.data.b));
xev.serial = 0; // These are just to squash warnings...
xev.send_event = 0;
xev.display = 0;
xev.window = 0;
xev.format = 0;
if (!spnav_x11_event(reinterpret_cast<XEvent *>(&xev), &navEvent)) {
return false;
}
} else {
return false;
}
// navEvent is now initialised
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.