Обрабатывать события X11 с помощью Qt5

Я портирую свое приложение с Qt4 на Qt5.

Насколько я знаю, Qt5 больше не поддерживает обработку событий Xlib и использует
События XCB (обработчик событий получает xcb_generic_event_t объект). тем не мение spnav библиотека, которую я использую, поддерживает только события X11 (она разбирает XEvent объект для извлечения необходимой информации). Можно ли обрабатывать события X11 в Qt5 или конвертировать 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;
}

1

Решение

В случае, если другие столкнутся с той же проблемой: 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]