Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 106

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

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() увСдомляСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ свойство измСнилось.