【问题标题】:Handle X11 events with Qt5使用 Qt5 处理 X11 事件
【发布时间】: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 我明白这一点。问题是是否有一种通用的方法来做到这一点
  • 恐怕这是“常见”的做法:(

标签: c++ qt qt5 x11 xcb


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多