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 上调试通过。 |