QT 4: программирование GUI на С++
Шрифт:
• OLE_COLOR — QColor,
• SAFEARRAY(VARIANT) — QList<QVariant>,
• SAFEARRAY(BSTR) — QStringList,
• SAFEARRAY(BYTE) — QByteArray,
• VARIANT — QVariant,
• IFontDisp * — QFont,
• IPictureDisp * — QPixmap,
• Тип, определяемый пользователем — QRect, QSize, QPoint.
Например, входной параметр типа VARIANT_BOOL становится типом bool, а выходной параметр типа VARIANT_BOOL
Для получения списка всех свойств, сигналов и слотов, доступных в объектах QAxObject или QAxWidget вместе с их типами Qt, сделайте вызов функции QAxBase::generateDocumentation или используйте утилиту командной строки Qt dumpdoc, расположенную в каталоге Qt tools\activeqt\dumpdoc.
Теперь продолжим рассмотрение конструктора PlayerWindow:
После вызова QAxWidget::setControl мы вызываем функцию QObject::setProperty для установки свойства ShowControls (отображать элементы управления) элемента управления Media Player системы Windows на значение false, поскольку мы предоставляем свои собственные кнопки для работы с компонентом. Функция QObject::setProperty может использоваться как для свойств СОМ, так и для обычных свойств Qt. Ее второй параметр имеет тип QVariant.
Затем мы вызываем функцию setSizePolicy, чтобы элемент управления ActiveX мог занять все имеющееся в менеджере компоновки пространство, и мы подсоединяем три события ActiveX компонента СОМ к трем слотам.
Остальная часть конструктора PlayerWindow следует обычному образцу, за исключением того, что мы подсоединяем некоторые сигналы Qt к слотам объекта COM (Play, Pause и Stop). Мы показали здесь реализацию только кнопки Stop, поскольку другие кнопки реализуются аналогично.
Функция timerEvent
Мы не будем рассматривать остальную часть программного кода, поскольку большая часть его не имеет непосредственного отношения к ActiveX и не содержит ничего такого, что мы уже не обсуждали ранее. Данный программный код имеется на компакт-диске.
В файле .pro нам необходимо задать элемент для связи с модулем QAxContainer.
При работе с объектами СОМ одной из часто возникающих потребностей является необходимость непосредственного вызова метода СОМ (вместо подсоединения его к сигналу Qt). Наиболее просто это сделать путем вызова функции QAxBase::dynamicCall с указанием имени и сигнатуры метода в первом параметре и аргументов метода в дополнительных параметрах. Например:
Функция dynamicCall принимает до восьми параметров типа QVariant и возвращает объект типа QVariant. Если нам необходимо передавать таким образом IDispatch * или IUnknown *, мы можем инкапсулировать компонент в QAxObject и вызвать для него функцию asVariant для преобразования его в тип QVariant. Если нам необходимо вызвать метод СОМ, который возвращает IDispatch * или IUnknown *, или если нам необходимо осуществлять доступ к свойству СОМ одного из этих типов, мы можем вместо этого использовать функцию querySubObject:
Если мы собираемся вызывать методы, которые имеют неподдерживаемые типы данных в их списке параметров, мы можем использовать QAxBase::queryInterface для получения интерфейса СОМ и непосредственного вызова метода. Мы должны вызвать функцию Release после завершения использования интерфейса, что является обычным при работе с СОМ. Если нам приходится часто вызывать такие методы, мы можем создать подкласс QAxObject или QAxWidget и обеспечить функции—члены, которые инкапсулируют вызовы интерфейса СОМ. Однако убедитесь, что подклассы QAxObject и QAxWidget не могут определять свои собственные свойства, сигналы и слоты.