【发布时间】:2016-07-18 14:39:07
【问题描述】:
我正在将我的应用程序从 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;
}
【问题讨论】:
-
看看this
-
@AlexisP。我试过这个,但是过滤器方法有以下原型。
bool QAbstractNativeEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *result)。void* message实际上是指向xcb_generic_event_t的指针,我无法从这种类型的对象中检索到有用的信息 -
你必须包含“X11/Xlib.h”并从
xcb_generic_event_t手动合成一个XEvent。 -
@KubaOber 我明白这一点。问题是是否有一种通用的方法来做到这一点
-
恐怕这是“常见”的做法:(