14 void onPlayStateChange(int oldState, int newState);
15 void onReadyStateChange(ReadyStateConstants readyState);
16 void onPositionChange(double oldPos, double newPos);
17 void sliderValueChanged(int newValue);
18 void openFile;
19 private:
20 QAxWidget *wmp;
21 QToolButton *openButton;
22 QToolButton *playPauseButton;
23 QToolButton *stopButton;
24 QSlider *seekSlider;
25 QString fileFilters;
26 int updateTimer;
27 };
Класс PlayerWindow наследует QWidget. Макрос Q_ENUMS, расположенный сразу после Q_OBJECT, необходим для указания компилятору moc, что константы ReadyStateConstants, используемые в слоте onReadyStateChange, имеют тип enum. В закрытой секции мы объявляем переменную—член QAxWidget *.
01 PlayerWindow::PlayerWindow
02 {
03 wmp = new QAxWidget;
04 wmp->setControl("{22D6F312-B0F6-11D0-94AB-0080C74C7E95}");
Конструктор начинается с создания объекта QAxWidget для инкапсулирования элемента управления ActiveX Media Player системы Windows. Модуль QAxContainer состоит из трех классов: QAxObject инкапсулирует объект COM, QAxWidget инкапсулирует элемент управления ActiveX и QAxBase реализует основную функциональность СОМ для QAxObject и QAxWidget.
Мы вызываем функцию setControl для объекта QAxWidget с идентификатором класса элемента управления Media Player 6.4 системы Windows. Это создает экземпляр требуемого компонента. С этого момента все свойства, события и методы элемента управления ActiveX доступны как свойства, сигналы и методы Qt объекта QAxWidget.
Рис. 20.4. Дерево наследования для модуля QAxContainer.
Типы данных СОМ автоматически преобразуются в соответствующие типы объектов, как показано на рис. 20.5:
• VARIANT_BOOL — bool,
• char, short, int, long — int,
• unsigned char, unsigned short, unsigned int, unsigned long — uint,
• float, double — double,
• CY — qlonglong, qulonglong,
• BSTR — QString,
• DATE — QDateTime, QDate, QTime,
• OLE_COLOR — QColor,
• SAFEARRAY(VARIANT) — QList,
• SAFEARRAY(BSTR) — QStringList,
• SAFEARRAY(BYTE) — QByteArray,
• VARIANT — QVariant,
• IFontDisp * — QFont,
• IPictureDisp * — QPixmap,
• Тип, определяемый пользователем — QRect, QSize, QPoint.
Например, входной параметр типа VARIANT_BOOL становится типом bool, а выходной параметр типа VARIANT_BOOL становится типом bool &. Ecли пoлyчeнный тип являeтcя клaccoм Qt (QString, QDateTime и так далее), входной параметр становится ссылкой с модификатором const (например, const QString &).
Для получения списка всех свойств, сигналов и слотов, доступных в объектах QAxObject или QAxWidget вместе с их типами Qt, сделайте вызов функции QAxBase::generateDocumentation или используйте утилиту командной строки Qt dumpdoc, расположенную в каталоге Qt tools\activeqt\dumpdoc.
Теперь продолжим рассмотрение конструктора PlayerWindow:
05 wmp->setProperty("ShowControls", false);
06 wmp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
07 connect(wmp, SIGNAL(PlayStateChange(int, int)),
08 this, SLOT(onPlayStateChange(int, int)));
09 connect(wmp, SIGNAL(ReadyStateChange(ReadyStateConstants)),
10 this, SLOT(onReadyStateChange(ReadyStateConstants)));