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

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

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

15 QSizeTicker::sizeHint() const

16 {

17 return fontMetrics().size(0, text());

18 }

Ѐункция sizeHint() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² качСствС идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ области, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ тСкстом. Ѐункция QWidget::fontMetrics() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QFontMetrics, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡˆΡ€ΠΈΡ„Ρ‚Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ опрСдСляСм Ρ€Π°Π·ΠΌΠ΅Ρ€ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ тСкста. (Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QFontMetrics::size() задаСтся Ρ„Π»Π°ΠΆΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ для простых строк, поэтому ΠΌΡ‹ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ 0.)

19 void Ticker::paintEvent(QPaintEvent * /* event */)

20 {

21 QPainter painter(this);

22 int textWidth = fontMetrics().width(text());

23 if (textWidth < 1)

24 return;

25 int Ρ…= -offset;

26 while (x < width()) {

27 painter.drawText(x, 0, textWidth, height(),

28 Qt::AlignLeft | Qt::AlignVCenter, text());

29 x += textWidth;

30 }

31 }

Ѐункция paintEvent() ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ тСкст ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QPainter::drawText(). Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fontMetrics() для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° области, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ тСкстом ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ тСкст ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для заполнСния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΠΎ всСй Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΈΠ½Π΅, учитывая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ смСщСния offset.

32 void Ticker::showEvent(QShowEvent * /* event */)

33 {

34 myTimerId = startTimer(30);

35 }

функция showEvent() запускаСт Ρ‚Π°ΠΉΠΌΠ΅Ρ€. Π’Ρ‹Π·ΠΎΠ² QObject::startTimer() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число—идСнтификатор, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. QObject ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько нСзависимых Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π». ПослС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ startTimer() Qt Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 30 миллисСкунд, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ зависит ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы.

ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ startTimer() Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π² конструкторС Ticker, Π½ΠΎ ΠΌΡ‹ экономим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСсурсы Π·Π° счСт Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Qt событий Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΈΠ΄ΠΈΠΌ.

36 void Ticker::timerEvent(QTimerEvent *event)

37 {

38 if (event->timerId() == myTimerId) {

39 ++offset;

40 if (offset >= fontMetrics().width(text()))

41 offset= 0;

42 scroll(-1, 0);

43 } else {

44 QWidget::timerEvent(event);

45 }

46 }

Ѐункция timerEvent() вызываСтся систСмой Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Она ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ смСщСниС offset Π½Π° 1 для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ двиТСния ΠΏΠΎ всСй области Π²Ρ‹Π²ΠΎΠ΄Π° тСкста. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ содСрТимоС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π½Π° ΠΎΠ΄ΠΈΠ½ пиксСль Π²Π»Π΅Π²ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„yΠ½ΠΊΡ†ΠΈΠΈ QWidget::scroll(). Π’ΠΏΠΎΠ»Π½Π΅ достаточно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ update() вмСсто scroll(), Π½ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scroll() Π±ΠΎΠ»Π΅Π΅ эффСктивСн, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° просто ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° экранС пиксСли ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС рисования для ΠΎΡ‚ΠΊΡ€Ρ‹Π²ΡˆΠ΅ΠΉΡΡ области Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° (которая Π² Π΄Π°Π½Π½ΠΎΠΌ случаС прСдставляСт собой полосу ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ Π² ΠΎΠ΄ΠΈΠ½ пиксСль).

Если событиС Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π½Π΅ относится ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ дальшС Π² наш Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс.

47 void Ticker::hideEvent(QHideEvent * /* event */)

48 {

49 killTimer(myTimerId);

50 }

Ѐункция hideEvent() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ QObject::killTimer() для остановки Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°.

Бобытия Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌΠΈ событиями, ΠΈ Ссли Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ², это ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΡ‚ΡŒ отслСТиваниС всСх ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ². Π’ Ρ‚Π°ΠΊΠΈΡ… ситуациях ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π»Π΅Π³Ρ‡Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QTimer. QTimer Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» сигнал timeout(). QTimer Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ² (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·).

Установка Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² событий

Одним ΠΈΠ· Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ эффСктивных срСдств Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ событий Qt являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QObject ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ события Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ экзСмпляра ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QObject Π΅Ρ‰Π΅ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄ΠΎΠΉΠ΄ΡƒΡ‚ Π΄ΠΎ послСднСго.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ наш Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ CustomerInfoDialog состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ² строк QLineEdit ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Space (ΠΏΡ€ΠΎΠ±Π΅Π») для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ фокуса ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ QLineEdit. Π’Π°ΠΊΠΎΠΉ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠΉ для собствСнных Π½ΡƒΠΆΠ΄, ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π°Π²Ρ‹ΠΊ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании подкласса QLineEdit ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„yΠ½ΠΊΡ†ΠΈΠΈ keyPressEvent() для Π²Ρ‹Π·ΠΎΠ²Π° focusNextChild(), ΠΈ ΠΎΠ½ΠΎ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

01 void MyLineEdit::keyPressEvent(QKeyEvent *event)

02 {

03 if (event->key()== Qt::Key_Space) {

04 focusNextChild();

05 } else {

06 QLineEdit::keyPressEvent(event);

07 }

08 }

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ основной нСдостаток: Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² Ρ„ΠΎΡ€ΠΌΠ΅ нСсколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QComboBox ΠΈ QSpinBox), ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… подклассы для обСспСчСния Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΠ³ΠΎ повСдСния. Π›ΡƒΡ‡ΡˆΠ΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ CustomerInfoDialog событий наТатия клавиш ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ своих Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΈ Π² обСспСчСнии Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ повСдСния Π² Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² событий. Настройка Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² событий сострит ΠΈΠ· Π΄Π²ΡƒΡ… этапов:

1. ЗарСгистрируйтС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚β€”ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ с Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ посрСдством Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ installEventFilter() для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

2. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eventFilter() ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠ°.

Π Π΅Π³ΠΈΡΡ‚Ρ€Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° контроля ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² конструкторС CustomerInfoDialog:

01 CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)

02 : QDialog(parent)

03 {

04 firstNameEdit->installEventFilter(this);

05 lastNameEdit->installEventFilter(this);

06 cityEdit->installEventFilter(this);

07 phoneNumberEdit->installEvehtFilter(this);

08 }

ПослС рСгистрации Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π° события Ρ‚Π΅ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌ firstNameEdit, lastNameEdit, cityEdit ΠΈ phoneNumberEdit, сначала Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ eventFilter() Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° CustomerInfoDialog ΠΈ лишь Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠΉΠ΄ΡƒΡ‚ ΠΏΠΎ своСму прямому Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. (Если для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° установлСно нСсколько Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² событий, ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, начиная с установлСнного послСдним ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ.)

НиТС приводится функция eventFilter(), которая ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ события:

01 bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)

02 {

03 if (target == firstNameEdit || target == lastNameEdit

04 || target == cityEdit || target == phoneNumberEdit) {

05 if (event->type() == QEvent::KeyPress) {

06 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

07 if (keyEvent->key() == Qt::Key_Space) {

08 focusNextChild();

09 return true;

10 }

11 }

12 }

13 return QDialog::eventFilter(target, event);

14 }

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ провСряСм, являСтся Π»ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ строкой рСдактирования QLineEdit. Если событиС Π²Ρ‹Π·Π²Π°Π½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ Ρ‚ΠΈΠΏ Π² QKeyEvent ΠΈ провСряСм, какая клавиша Π½Π°ΠΆΠ°Ρ‚Π°. Если Π½Π°ΠΆΠ°Ρ‚Π° клавиша ΠΏΡ€ΠΎΠ±Π΅Π»Π° Space, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ€ΠΈΡŽ focusNextChild() для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° фокуса Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² фокусной Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true для увСдомлСния Qt ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π½Π°ΠΌΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ события. Если Π±Ρ‹ ΠΌΡ‹ Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ false, Qt отослала Π±Ρ‹ событиС ΠΏΠΎ Π΅Π³ΠΎ прямому Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ,Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ вставкС лишнСго ΠΏΡ€ΠΎΠ±Π΅Π»Π° Π² строку рСдактирования QLineEdit.

Если Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ Π½Π΅ являСтся QLineEdit ΠΈΠ»ΠΈ Ссли событиС Π½Π΅ Π²Ρ‹Π·Π²Π°Π½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ клавиши Space, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса eventFilter(). Π¦Π΅Π»Π΅Π²Ρ‹ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ QDialog осущСствляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ. (Π’ Qt 4.1 этого Π½Π΅ происходит с QDialog. Однако Π΄Ρ€ΡƒΠ³ΠΈΠ΅ классы Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² Qt, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QScrollArea, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ свои Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹.)

Qt прСдусматриваСт ΠΏΡΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ событий:

1. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий.

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий, ΠΊΠ°ΠΊ mousePressEvent(), keyPressEvent() ΠΈ paintEvent(), прСдставляСт собой ΠΎΡ‡Π΅Π½ΡŒ распространСнный способ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ событий. ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

2. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QObject::event().

ΠŸΡƒΡ‚Π΅ΠΌ пСрСопрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ event() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ события Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΄ΠΎΠΉΠ΄ΡƒΡ‚ Π΄ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… событий. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆ для измСнСния принятого ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ повСдСния клавиши табуляции Tab, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅. Он Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π΄ΠΊΠΈΡ… событий, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ прСдусмотрСны ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, QEvent::HoverEnter). ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ event() Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса event() для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π΅Ρ… событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ сами Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ.