Board logo

标题: 在 Qt 中处理平台相关的底层事件(1) [打印本页]

作者: look_w    时间: 2018-5-19 15:43     标题: 在 Qt 中处理平台相关的底层事件(1)

1. Qt 中与平台相关的宏定义        Qt 提供了以下标识系统的宏定义,如表1所示:      
表 1. Qt 提供的系统标识宏定义系统标志对应的平台Q_WS_WINWindowsQ_WS_X11XWindowQ_WS_MACMac
        如果项目中调用了平台相关的 APIs ,那么利用条件编译,使得源程序不用修改,就可以适用于不同的平台。      
        对于 XWindow 平台,代码片断如清单1所示:      
清单 1.
1
2
3
#if defined(Q_WS_X11)
//与 XWindow 相关的 native APIs
#endif




        对于 Windows 平台,代码片断如清单2所示:      
清单 2.
1
2
3
#if defined(Q_WS_WIN)
//与 Windows 相关的 native APIs
#endif




        对于 MAC 平台,代码片断如清单3所示:      
清单 3.
1
2
3
#if defined(Q_WS_MAC)
//与Mac相关的native APIs
#endif




2. Xlib 与 XEvent        Xlib 是 XWindow 提供的 API 集合,Xlib 之上是 Xt Intrinsics library,Xt 采用面向对象的设计方法,提供了大量的 widgets。        在 Xt 之上则是各种各样的 toolkits,最常用的是 Motif。        Qt 没有对 Xt 进行封装,而是直接建立在 Xlib 之上。      
        Xlib 用一个叫"XEvent"的结构来保存从 X 服务器那里接收到的事件。        Xlib 提供了大量的事件类型。        XEvent 包括事件的类型,以及与事件相关的数据。      
        Qt 也定义了一组事件类。        其中 QEvent 是基类。        其他具体事件类,例如 QMouseEvent、QKeyEvent、QFocusEvent、QPaintEvent、QMoveEvent、QResizeEvent 等都是从 QEvent 继承而来。        多数情况下,利用 Qt 的事件机制,能够满足我们的需求。        但是,在某些特定的情况,我们需要能够截获 XWindow 的底层事件,并对其进行处理。        本文介绍了两种截获 XEvent 的方法,一种是重载 QApplication 的 x11EventFilter() 方法;另一种是重载 QWidget 的 x11Event() 方法。        文中提供的例子基于 Qt 4.3,并在 Fedora Core 6 上调试通过。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0