QT 4: программирование GUI на С++
Шрифт:
Подобное совмещение вызовов QPainter и GDI иногда может дать странный результат, особенно когда вызовы QPainter выполняются после вызовов GDI, потому что QPainter делает некоторые предположения о состоянии базового уровня рисования.
Qt определяет один из следующих четырех символов оконной системы: Q_WS_WIN, Q_WS_X11, Q_WS_MAC и Q_WS_QWS (Qtopia). Мы должны обеспечить включение хотя бы одного заголовка Qt перед их использованием в приложениях. Qt также обеспечивает препроцессорные символы для идентификации операционной системы:
• Q_OS_AIX
• Q_OS_BSD4
• Q_OS_BSDI
• Q_OS_CYGWIN
• Q_OS_DGUX
• Q_OS_DYNIX
• Q_OS_FREEBSD
• Q_OS_HPUX
• Q_OS_HURD
• Q_OS_IRIX
• Q_OS_LINUX
• Q_OS_LYNX
• Q_OS_MAC
• Q_OS_NETBSD
• Q_OS_OPENBSD
• Q_OS_OS2EMX
• Q_OS_OSF
• Q_OS_QNX6
• Q_OS_QNX
• Q_OS_RELIANT
• Q_OS_SCO
• Q_OS_SOLARIS
• Q_OS_ULTRIX
• Q_OS_UNIXWARE
• Q_OS_WIN32
• Q_OS_WIN64
Мы
Кроме макросов операционной и оконной систем существует также ряд макросов компилятора. Например, 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 состоит из двух модулей:
• Модуль QAxContainer позволяет нам использовать объекты СОМ и встраивать элементы управления ActiveX в приложения Qt.
• Модуль QAxServer позволяет нам экспортировать пользовательские объекты СОМ и элементы управления ActiveX, написанные с помощью средств разработки Qt.