QT 4: программирование GUI на С++
Шрифт:
Теперь мы рассмотрим модуль QAxServer. Этот модуль позволяет нам превратить стандартную программу Qt в сервер ActiveX. Сервер может быть как совместно используемой библиотекой, так и автономным приложением. Серверы в виде совместно используемых библиотек часто называют внутрипроцессными серверами (in-process servers), а автономные приложения — внепроцессными серверами (out-of-process servers).
Наш первый пример QAxServer является внутрипроцессным сервером, отображающим виджет с шариком, который может прыгать вправо и влево. Мы рассмотрим также способы встраивания этого виджета в Internet Explorer.
Рис. 20.6.
Ниже приводится начало определения класса виджета AxBouncer:
AxBouncer наследует как QWidget, так и QAxBindable. Класс QAxBindable обеспечивает интерфейс между виджетом и клиентом ActiveX. Любой QWidget может быть экспортирован как элемент управления ActiveX, но путем создания подкласса QAxBindable мы можем уведомлять клиента об изменениях значения свойства и peализовывать интерфейсы СОМ в дополнение к уже реализованным при помощи QAxServer.
Если при использовании множественного наследования имеются классы, производные от QObject, мы должны всегда располагать производные от QObject классы первыми для того, чтобы компилятор moc мог их извлечь.
Мы объявляем три свойства для чтения и записи и одно свойство только для чтения. Макрос Q_ENUMS необходим для указания компилятору moc на то, что SpeedValue имеет тип enum (перечисление). Это перечисление объявляется в открытой секции класса:
Конструктор AxBouncer является
Функция createAggregate класса QAxBindable переопределяется. Мы рассмотрим ее вскоре.
Защищенная и закрытая секции этого класса имеют тот же вид, как и для стандартного виджета Qt.
Конструктор AxBouncer инициализирует закрытые переменные этого класса.
Функция setColor устанавливает значение свойства color (цвет). Она вызывает функцию update для перерисовки виджета.
Необычной частью являются вызовы функций requestPropertyChange и propertyChanged. Эти функции наследуются от класса QAxBindable и в идеальном случае должны вызываться при всяком изменении свойства. Функция requestPropertyChange спрашивает у клиента разрешение на изменение свойства и возвращает true, если клиент дает такое разрешение. Функция propertyChanged уведомляет клиента о том, что свойство изменилось.