首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qt5处理X11事件

使用Qt5处理X11事件
EN

Stack Overflow用户
提问于 2016-03-30 22:11:59
回答 1查看 2.1K关注 0票数 1

我正在将我的应用程序从Qt4移植到Qt5。

据我所知,Qt5不再支持处理Xlib事件,而是使用XCB事件(事件处理程序获取xcb_generic_event_t对象)。然而,我正在使用的spnav库只支持X11事件(它解析XEvent对象来检索必要的信息)。是否可以在Qt5中处理X11事件或将xcb_generic_event_t转换为XEvent

在Qt4中,代码看起来像这样:

代码语言:javascript
复制
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;   
}
EN

回答 1

Stack Overflow用户

发布于 2018-09-15 10:17:20

如果其他人遇到同样的问题: spnav_x11_event()只需要复制几个字段--下面是我为FreeCAD编写的代码:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36311439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档