Мы можем считать, что по крайней мере один из этих символов будет определен. Для удобства Qt также определяет Q_OS_WIN, когда обнаруживается Win32 или Win64, и Q_OS_UNIX, когда обнаруживается любая операционная система типа Unix (включая Linux и Mac OS X). Во время выполнения приложений мы можем проверить QSysInfo::WindowsVersion или QSysInfo::MacintoshVersion для установки отличий между различными версиями Windows (2000, ME и так далее) или Mac OS X (10.2, 10.3 и так далее).
Кроме макросов операционной и оконной систем существует также ряд макросов компилятора. Например, Q_CC_MSVC определяется в том случае, если компилятором является Visual С++ компании Microsoft. Такие макросы полезны, когда приходится обходить ошибки компилятора.
Несколько классов графического пользовательского интерфейса Qt обеспечивают зависимые от платформы функции, которые возвращают описатели (handle) базового объекта для низкоуровневой обработки. Они перечислены на рис. 20.2:
Mас OS X:
• ATSFontFormatRef QFont::handle();
• CGImageRef QPixmap::macCGHandle();
• GWorldPtr QPixmap::macQDAlphaHandle();
• GWorldPtr QPixmap::macQDHandle();
• RgnHandle QRegion::handle();
• HIViewRef QWidget::winId();
Windows:
• HCURSOR QCursor::handle();
• HDC QPaintEngine::getDC();
• HDC QPrintEngine::getPrinterDC();
• HFONT QFont::handle();
• HPALETTE QColormap::hPal();
• HRGN QRegion::handle();
• HWND QWidget::winId();
X11:
• Cursor QCursor::handle();
• Font QFont::handle();
• Picture QPixmap::x11PictureHandle();
• Picture QWidget::x11PictureHandle();
• Pixmap QPixmap::handle();
• QX11Info QPixmap::x11Info();
• QX11Info QWidget::x11Info();
• Region QRegion::handle();
• Screen QCursor::x11Screen();
• SmcConn QSessionManager::handle();
• Window QWidget::handle();
• Window QWidget::winId();
В системе X11 функции QPixmap::x11Info() и QWidget::x11Info() возвращают объект QX11Info, который обеспечивает различные указатели и описатели с помощью ряда функций, включая display(), screen(), colormap() и visual(). Мы можем использовать их для настройки графического контекста, например QWidget или QPixmap.
Приложениям Qt, которым необходимо взаимодействовать с другими инструментальными средствами и библиотеками, часто приходится осуществлять доступ к низкоуровневым событиям (XEvent в системе X11, MSG в системе Windows, Eventref в системе Mac OS X, QWSEvent для Qtopia), прежде чем они будут преобразованы в события QEvent. Мы можем делать это путем создания подкласса QApplication и переопределения соответствующего зависимого от платформы фильтра событий — одну из следующих функций: x11EventFilter(), winEventFilter(), macEventFilter() и qwsEventFilter(). Мы можем поступать по-другому и осуществлять доступ к зависимым от платформы событиям, которые передаются заданному QWidget путем переопределения какой-то одной из функций winEvent(), x11Event(), macEvent() и qwsEvent(). Это может пригодиться для обработки событий определенного типа, которые Qt обычно игнорирует, например события джойстика.
Более подробную информацию относительно применения зависимых от платформы средств, в том числе как развертывать приложения Qt на различных платформах, можно найти в сети Интернет по адресу http://doc.trolltech.com/4.1/win-system.html.
Применение ActiveX в системе Windows
Технология ActiveX компании Microsoft позволяет приложениям включать в себя компоненты интерфейса пользователя других приложений или библиотек. Она построена на применении технологии СОМ компании Microsoft и определяет один набор интерфейсов приложений, использующих компоненты, и другой набор интерфейсов приложений и библиотек, предоставляющих компоненты.
Версия Qt/Windows для настольных компьютеров (Desktop Edition) обеспечивает рабочую среду ActiveQt для «бесшовного соединения» ActiveX и Qt. ActiveQt состоит из двух модулей: