QT 4: программирование GUI на С++
Шрифт:
Конструктор AxBouncer является стандартным конструктором виджета с параметром parent. Макрос QAXFACTORY_DEFAULT, который мы используем для экспорта компонента,
Функция createAggregate класса QAxBindable переопределяется. Мы рассмотрим ее вскоре.
Защищенная и закрытая секции этого класса имеют тот же вид, как и для стандартного виджета Qt.
Конструктор AxBouncer инициализирует закрытые переменные этого класса.
Функция setColor устанавливает значение свойства color (цвет). Она вызывает функцию update для перерисовки виджета.
Необычной частью являются вызовы функций requestPropertyChange и propertyChanged. Эти функции наследуются от класса QAxBindable и в идеальном случае должны вызываться при всяком изменении свойства. Функция requestPropertyChange спрашивает у клиента разрешение на изменение свойства и возвращает true, если клиент дает такое разрешение. Функция propertyChanged уведомляет клиента о том, что свойство изменилось.
Устанавливающие свойства функции setSpeed и setRadius следуют этому же образцу, и так же работают слоты start и stop, поскольку они изменяют значение свойства running (приложение выполняется).
Осталось рассмотреть еще одну интересную функцию—член класса AxBouncer:
Функция createAggregate
класса QAxBindable переопределяется. Она позволяет нам реализовать интерфейсы СОМ, которые модуль QAxServer еще не реализовал, или обойти определенные по умолчанию в QAxServer интерфейсы СОМ. Ниже мы делаем это для обеспечения интерфейса IObjectSafety, который используется в Internet Explorer для доступа к свойствам безопасности компонента. Это является стандартным способом устранения непопулярного сообщения об ошибке «Object not safe for scripting» (объект небезопасен при использовании в сценарии) в Internet Explorer.Ниже приводится определение класса, которое реализует интерфейс IObjectSafety:
Класс ObjectSafetyImpl наследует как QAxAggregated, так и IObjectSafety. Класс QAxAggregated является абстрактным базовым классом, предназначенным для реализации дополнительных интерфейсов СОМ. Объект СОМ, который расширяет QAxAggregated, доступен при помощи функции controllingUnknown. Этот объект СОМ создается незаметно для пользователя модулем QAxServer.
Макрос QAXAGG_IUNKNOWN обеспечивает стандартную реализацию функций QueryInterface, AddRef и Release. В этих реализациях просто делается вызов одноименных функций для управляющего объекта СОМ.
Функция queryInterface — чистая виртуальная функция класса QAxAggregated. Она вызывается управляющим объектом СОМ для предоставления доступа к интерфейсу, который обеспечивается подклассом QAxAggregated. Мы должны возвращать E_NOINTERFACE для интерфейсов, которые мы не определили, и также для IUnknown.