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

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

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

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π² Qt Π½Π°ΠΌ Ρ€Π΅Π΄ΠΊΠΎ приходится Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ событиях, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Qt сами Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ сигналы Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° любоС сущСствСнноС событиС. Бобытия становятся ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ создании Π½Π°ΠΌΠΈ своих сооствСнных Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt.

Бобытия Π½Π΅ слСдуСт ΠΏΡƒΡ‚Π°Ρ‚ΡŒ с сигналами. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, сигналы ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ uспользовании Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ события ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. НапримСр, ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ QPushButton ΠΌΡ‹ большС заинтСрСсованы Π² Π΅Π΅ сигналС clicked(), Ρ‡Π΅ΠΌ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… событий ΠΌΡ‹ΡˆΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΡ… этот сигнал. Но Ссли ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ класс, ΠΊΠ°ΠΊ QPushButton, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ ΠΏΡ€ΠΈ нСобходимости ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал clicked().

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий

Π’ Qt событиС (event) β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ QEvent. Qt ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ сотни Ρ‚ΠΈΠΏΠΎΠ² событий, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… идСнтифицируСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ пСрСчислСния. НапримСр, QEvent::type() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ QEvent::MouseButtonPress для событий наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ.

Для событий ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² нСдостаточно Ρ‚Π΅Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² простом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ QEvent: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для событий наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, какая ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΌΡ‹ΡˆΠΊΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ возникновСнию Π΄Π°Π½Π½ΠΎΠ³ΠΎ события, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ находился курсор ΠΌΡ‹ΡˆΠΊΠΉ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ возникновСния события. Π­Ρ‚Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ информация хранится Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… подклассах QEvent, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² QMouseEvent.

Бобытия ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΎ сСбС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ своих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ event(), унаслСдованных ΠΎΡ‚ класса QObject. РСализация event() Π² QWidget ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… событий ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ событий, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ mousePressEvent(), keyPressEvent() ΠΈ paintEvent().

ΠœΡ‹ ΡƒΠΆΠ΅ ознакомились Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… со ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ событий ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MainWindow, IconEditor ΠΈ Plotter. БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² событий, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² справочной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ QEvent, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ самому ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ события. Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим Π΄Π²Π° распространСнных Ρ‚ΠΈΠΏΠ° событий, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ обсуТдСния, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ события ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ события Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.

Бобытия ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡƒΡ‚Π΅ΠΌ пСрСопрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ keyPressEvent() ΠΈ keyReleaseEvent(). Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Plotter пСрСопрСдСляСт keyPressEvent(). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°ΠΌ трСбуСтся ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ keyPressEvent(), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ отпусканиС клавиш Π²Π°ΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΊΠ»Π°Π²ΠΈΡˆβ€”ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ для клавиш Ctrl, Shift ΠΈ Alt, Π° ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² keyPressEvent() ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QKeyEvent::modifiers(). НапримСр, Ссли Π±Ρ‹ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ CodeEditor (Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°), ΠΎΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ keyPressEvent() с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ клавиш Home ΠΈ Ctrl+Home Π±Ρ‹Π» Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

01 void CodeEditor::keyPressEvent(QKeyEvent *event)

02 {

03 switch (event->key()) {

04 case Qt::Key_Home:

05 if (event->modifiers() & Qt::ControlModifier) {

06 goToBeginningOfDocument();

07 } else {

08 goToBeginningOfLine();

09 }

10 break;

11 case Qt::Key_End:

12 …

13 default:

14 QWidget::keyPressEvent(event);

15 }

16 }

Клавиши Tab ΠΈ Backtab (Shift+Tab) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой особый случай. Они ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QWidget::event() Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° keyPressEvent() c установкой фокуса Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² фокусной Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½ΠΎ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ CodeEditor ΠΌΡ‹, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ табуляции Tab для обСспСчСния отступа Π² Π½Π°Ρ‡Π°Π»Π΅ строки. ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ event() выглядСло Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

01 bool CodeEditor::event(QEvent *event)

02 {

03 if (event->type() == QEvent::KeyFress) {

04 QKeyEvent *keyEvent = static_cast<QKeyEvent *>event;

05 if (keyEvent->key() == Qt::Key_Tab) {

06 insertAtCurrentPosition('\t');

07 return true;

08 }

09 }

10 return QWidget::event(event);

11 }

Если событиС сгСнСрировано Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° QEvent Π² QKeyEvent ΠΈ провСряСм, какая клавиша Π±Ρ‹Π»Π° Π½Π°ΠΆΠ°Ρ‚Π°. Если это клавиша Tab, ΠΌΡ‹ выполняСм Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ Qt ΠΎΠ± ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π½Π°ΠΌΠΈ события. Если Π±Ρ‹ ΠΌΡ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ false, Qt ΠΏΠ΅Ρ€Π΅Π΄Π°Π»Π° Π±Ρ‹ cΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ.

ВысокоуровнСвый ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ клавиш ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ класса QAction. НапримСр, Ссли goToBeginningOfLine() ΠΈ goToBeginningOfDocument() ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ слотами Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° CodeEditor ΠΈ CodeEditor примСняСтся Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° класса MainWindow, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ клавиш ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

01 MainWindow::MainWindow()

02 {

03 editor = new CodeEditor;

04 setCentralWidget(editor);

05 goToBeginningOfLineAction =

06 new QAction(tr("Go to Beginning of Line"), this);

07 goToBeginningOfLineAction->setShortcut(tr("Home"));

08 connect(goToBeginningOfLineAction, SIGNAL(activated()),

09 editor, SLOT(goToBeginningOfLine()));

10 goToBeginningOfDocumentAction =

11 new QAction(tr("Go to Beginning of Document"), this);

12 goToBeginningOfDocumentAction->setShortcut(tr("Ctrl+Home"));

13 connect(goToBeginningOfDocumentAction, SlGNAL(activated()),

14 editor, SLOT(goToBeginningOfDocument());

15 …

16 }

Π­Ρ‚ΠΎ позволяСт Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² мСню ΠΈΠ»ΠΈ Π² панСль инструмСнтов, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Π² Π³Π»Π°Π²Π΅ 3. Если ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² интСрфСйсС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QAction ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ QShortcut; этот класс ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² QAction для связывания клавиши ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ со своим ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ связываниС клавиши Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ΅ с использованиСм QAction ΠΈΠ»ΠΈ QShortcut, Π±ΡƒΠ΄Π΅Ρ‚ постоянно Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΎΠΊΠ½ΠΎ, содСрТащСС этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° QAction::setShortcutContext() ΠΈΠ»ΠΈ QShortcut::setContext().

Π”Ρ€ΡƒΠ³ΠΈΠΌ распространСнным Ρ‚ΠΈΠΏΠΎΠΌ события являСтся событиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Если Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… событий Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ дСйствий ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚ΠΎ события Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ прилоТСниям Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Бобытия Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΈΠ³Π°ΡŽΡ‰ΠΈΡ… курсоров ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ просто для обновлСния экрана.

Для дСмонстрации событий Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Ticker. Π­Ρ‚ΠΎΡ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ тСкстовый Π±Π°Π½Π½Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдвигаСтся Π½Π° ΠΎΠ΄ΠΈΠ½ пиксСль Π²Π»Π΅Π²ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 30 миллисСкунд. Если Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΡˆΠΈΡ€Π΅ тСкста, послСдний повторяСтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ число Ρ€Π°Π· ΠΈ заполняСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΏΠΎ всСй Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π΅.

Рис. 7.1. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ Ticker.

НиТС приводится Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

01 #ifndef TICKER_H

02 #define TICKER_H

03 #include <QWidget>


04 class Ticker : public QWidget

05 {

06 Q_OBJECT

07 Q_PROPERTY(QString text READ text WRITE setText)


08 public:

09 Ticker(QWidget *parent = 0);

10 void setText(const QString &newText);

11 QString text() const { return myText; }

12 QSize sizeHint() const;


13 protected:

14 void paintEvent(QPaintEvent *event);

15 void timerEvent(QTimerEvent *event);

16 void showEvent(QShowEvent *event);

17 void hideEvent(QHideEvent *event);


18 private:

19 QString myText;

20 int offset;

21 int myTimerId;

22 };

23 #endif

ΠœΡ‹ пСрСопрСдСляСм Π² Ticker Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий, с трСмя ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ: timerEvent(), showEvent() ΠΈ hideEvent().

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ:

01 #include <QtGui>

02 #include "ticker.h"

03 Ticker::Ticker(QWidget *parent)

04 : QWidget(parent)

05 {

06 offset = 0;

07 myTimerId = 0;

08 }

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ смСщСниС offset Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0. ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° x Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹Π²ΠΎΠ΄Π° тСкста рассчитываСтся Π½Π° основС значСния offset. Π’Π°ΠΉΠΌΠ΅Ρ€ всСгда ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, поэтому ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 0, показывая, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π΅Ρ‰Π΅ Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½.

09 void Ticker::setText(const QString &newText)

10 {

11 myText = newText;

12 update();

13 updateGeometry();

14 }

Ѐункция setText() ycΡ‚aΠ½aΠ²Π»ΠΈΠ²aeΡ‚ oΡ‚oΠ±paΠΆaeΠΌΡ‹ΠΉ Ρ‚eΠΊcΡ‚. OΠ½a Π²Ρ‹Π·Ρ‹Π²aeΡ‚ update() для Π²Ρ‹Π΄Π°Ρ‡ΠΈ запроса Π½Π° пСрСрисовку ΠΈ updateGeometry() для увСдомлСния всСх ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, содСрТащих Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Ticker, ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.