11 connect(wmp, SIGNAL(PositionChange(double, double)),
12 this, SLOT(onPositionChange(double, double)));
ΠΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° QAxWidget::setControl() ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ QObject::setProperty() Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° ShowControls (ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ) ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Media Player ΡΠΈΡΡΠ΅ΠΌΡ Windows Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ false, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ. Π€ΡΠ½ΠΊΡΠΈΡ QObject::setProperty() ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ²ΠΎΠΉΡΡΠ² Π‘ΠΠ, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ² Qt. ΠΠ΅ Π²ΡΠΎΡΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ QVariant.
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ setSizePolicy(), ΡΡΠΎΠ±Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX ΠΌΠΎΠ³ Π·Π°Π½ΡΡΡ Π²ΡΠ΅ ΠΈΠΌΠ΅ΡΡΠ΅Π΅ΡΡ Π² ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΠΈ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΡΡΠΈ ΡΠΎΠ±ΡΡΠΈΡ ActiveX ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π‘ΠΠ ΠΊ ΡΡΠ΅ΠΌ ΡΠ»ΠΎΡΠ°ΠΌ.
13 stopButton = new QToolButton;
14 stopButton->setText(tr("&Stop"));
15 stopButton->setEnabled(false);
16 connect(stopButton, SIGNAL(clicked()), wmp, SLOT(Stop()));
17 β¦
18 }
ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° PlayerWindow ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ ΠΎΠ±ΡΠ°Π·ΡΡ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΈΠ³Π½Π°Π»Ρ Qt ΠΊ ΡΠ»ΠΎΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° COM (Play(), Pause() ΠΈ Stop()). ΠΡ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π·Π΄Π΅ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ Stop, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ.
01 void PlayerWindow::timerEvent(QTimerEvent *event)
02 {
03 if (event->timerId() == updateTimer) {
04 double curPos = wmp->property("CurrentPosition").toDouble();
05 onPositionChange(-1, curPos);
06 } else {
07 QWidget::timerEvent(event);
08 }
09 }
Π€ΡΠ½ΠΊΡΠΈΡ timerEvent() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΠΈΠ³ΡΡΠ²Π°Π½ΠΈΡ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠΉΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠΏΠ°. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΅Π΅ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π·ΡΠ½ΠΊΠ°. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ property() Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° CurrentPosition (ΡΠ΅ΠΊΡΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ) Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° QVariant ΠΈ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ toDouble() Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΅Π³ΠΎ Π² ΡΠΈΠΏ double. ΠΡ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ onPositionChange() Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π·ΡΠ½ΠΊΠ°.
ΠΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ Π΅Π³ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ActiveX ΠΈ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½ΠΈΡΠ΅Π³ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ Π½Π΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Π»ΠΈ ΡΠ°Π½Π΅Π΅. ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ-Π΄ΠΈΡΠΊΠ΅.
Π ΡΠ°ΠΉΠ»Π΅ .pro Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ QAxContainer.
CONFIG += qaxcontainer
ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ Π‘ΠΠ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΡΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΠ΅ΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Π‘ΠΠ (Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π΅Π³ΠΎ ΠΊ ΡΠΈΠ³Π½Π°Π»Ρ Qt). ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ QAxBase::dynamicCall() Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΠΈ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
wmp->dynamicCall("TitlePlay(uint)", 6);
Π€ΡΠ½ΠΊΡΠΈΡ dynamicCall() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π΄ΠΎ Π²ΠΎΡΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠΈΠΏΠ° QVariant ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° QVariant. ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ IDispatch * ΠΈΠ»ΠΈ IUnknown *, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² QAxObject ΠΈ Π²ΡΠ·Π²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ asVariant() Π΄Π»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΅Π³ΠΎ Π² ΡΠΈΠΏ QVariant. ΠΡΠ»ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠ·Π²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ Π‘ΠΠ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ IDispatch * ΠΈΠ»ΠΈ IUnknown *, ΠΈΠ»ΠΈ Π΅ΡΠ»ΠΈ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Π‘ΠΠ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ querySubObject():
QAxObject *session = outlook.querySubObject('"Session");
QAxObject *defaultContacts =
session->querySubObject("GetDefaultFolder(01DefaultFolders)",
"olFolderContacts");
ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ Π² ΠΈΡ ΡΠΏΠΈΡΠΊΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ QAxBase::queryInterface() Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π‘ΠΠ ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π°. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Release() ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π‘ΠΠ. ΠΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠ°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡ QAxObject ΠΈΠ»ΠΈ QAxWidget ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈβΡΠ»Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π‘ΠΠ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΡ QAxObject ΠΈ QAxWidget Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°, ΡΠΈΠ³Π½Π°Π»Ρ ΠΈ ΡΠ»ΠΎΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ QAxServer. ΠΡΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Qt Π² ΡΠ΅ΡΠ²Π΅Ρ ActiveX. Π‘Π΅ΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ, ΡΠ°ΠΊ ΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π‘Π΅ΡΠ²Π΅ΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡ Π²Π½ΡΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ (in-process servers), Π° Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ β Π²Π½Π΅ΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΠΌΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌΠΈ (out-of-process servers).
ΠΠ°Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ QAxServer ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π½ΡΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠ½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΠΈΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ Ρ ΡΠ°ΡΠΈΠΊΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΡΠ³Π°ΡΡ Π²ΠΏΡΠ°Π²ΠΎ ΠΈ Π²Π»Π΅Π²ΠΎ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Π² Internet Explorer.
Π ΠΈΡ. 20.6. ΠΠΈΠ΄ΠΆΠ΅Ρ AxBouncer Π² Internet Explorer.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π°ΡΠ°Π»ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ° Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° AxBouncer:
01 class AxBouncer : public QWidget, public QAxBindable
02 {
03 Q_OBJECT
04 Q_ENUMS(SpeedValue)
05 Q_PROPERTY(QColor color READ color WRITE setColor)
06 Q_PROPERTY(SpeedValue speed READ speed WRITE setSpeed)
07 Q_PROPERTY(int radius READ radius WRITE setRadius)
08 Q_PROPERTY(bool running READ isRunning)
AxBouncer Π½Π°ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΊΠ°ΠΊ QWidget, ΡΠ°ΠΊ ΠΈ QAxBindable. ΠΠ»Π°ΡΡ QAxBindable ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΌΠ΅ΠΆΠ΄Ρ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠΌ ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ActiveX. ΠΡΠ±ΠΎΠΉ QWidget ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ActiveX, Π½ΠΎ ΠΏΡΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ° QAxBindable ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈ peΠ°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π‘ΠΠ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΡΠΆΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ QAxServer.
ΠΡΠ»ΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡΡΡ ΠΊΠ»Π°ΡΡΡ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΠΎΡ QObject, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ΅Π³Π΄Π° ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΠ΅ ΠΎΡ QObject ΠΊΠ»Π°ΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΌΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ moc ΠΌΠΎΠ³ ΠΈΡ ΠΈΠ·Π²Π»Π΅ΡΡ.
ΠΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΡΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈ ΠΎΠ΄Π½ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ. ΠΠ°ΠΊΡΠΎΡ Q_ENUMS() Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ moc Π½Π° ΡΠΎ, ΡΡΠΎ SpeedValue ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ enum (ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅). ΠΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΠΎΡΠΊΡΡΡΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ°:
09 public:
10 enum SpeedValue { Slow, Normal, Fast };
11 AxBouncer(QWidget *parent = 0);
12 void setSpeed(SpeedValue newSpeed);
13 SpeedValue speed() const { return ballSpeed; }
14 void setRadius(int newRadius);
15 int radius() const { return ballRadius; }
16 void setColor(const QColor &newColor);
17 QColor color() const { return ballColor; }
18 bool isRunning() const { return myTimerId != 0; }
19 QSize sizeHint() const;
20 QAxAggregated *createAggregate();
21 public slots:
22 void start();
23 void stop();
24 signals:
25 void bouncing();
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ AxBouncer ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ parent. ΠΠ°ΠΊΡΠΎΡ QAXFACTORY_DEFAULT(), ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π΄Π»Ρ ΡΠΊΡΠΏΠΎΡΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ, ΡΡΠΎ Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠ°Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠ°.
Π€ΡΠ½ΠΊΡΠΈΡ createAggregate() ΠΊΠ»Π°ΡΡΠ° QAxBindable ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ. ΠΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΅Π΅ Π²ΡΠΊΠΎΡΠ΅.
26 protected:
27 void paintEvent(QPaintEvent *event);
28 void timerEvent(QTimerEvent *event);
29 private:
30 int intervalInMilliseconds() const;
31 QColor ballColor;
32 SpeedValue ballSpeed;
33 int ballRadius;
34 int myTimerId;
35 int x;
36 int delta;
37 };
ΠΠ°ΡΠΈΡΠ΅Π½Π½Π°Ρ ΠΈ Π·Π°ΠΊΡΡΡΠ°Ρ ΡΠ΅ΠΊΡΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΠΈΠΌΠ΅ΡΡ ΡΠΎΡ ΠΆΠ΅ Π²ΠΈΠ΄, ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ° Qt.
01 AxBouncer::AxBouncer(QWidget *parent)
02 : QWidget(parent)
03 {
04 ballColor = Qt::blue;
05 ballSpeed = Normal;
06 ballRadius = 15;
07 myTimerId = 0;
08 x = 20;
09 delta = 2;
10 }
ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ AxBouncer ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π·Π°ΠΊΡΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
01 void AxBouncer::setColor(const QColor &newColor)
02 {
03 if (newColor != ballColor &&
04 requestPropertyChange("color")) {
05 ballColor = newColor;
06 update();
07 propertyChanged("color");
08 }
09 }
Π€ΡΠ½ΠΊΡΠΈΡ setColor() ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° color (ΡΠ²Π΅Ρ). ΠΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ update() Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°.
ΠΠ΅ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΠ°ΡΡΡΡ ΡΠ²Π»ΡΡΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΉ requestPropertyChange() ΠΈ propertyChanged(). ΠΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° QAxBindable ΠΈ Π² ΠΈΠ΄Π΅Π°Π»ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΏΡΠΈ Π²ΡΡΠΊΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°. Π€ΡΠ½ΠΊΡΠΈΡ requestPropertyChange() ΡΠΏΡΠ°ΡΠΈΠ²Π°Π΅Ρ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π°Π΅Ρ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ propertyChanged() ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ.