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

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

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ„ΠΎΡ€ΠΌΡƒΠ». Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ элСктронной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Β«sum()Β» ΠΈ Β«avg()Β», Ρ€Π°ΡΡˆΠΈΡ€ΡΡ грамматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΊΡ‚ΠΎΡ€Π°. МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ эту Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, обСспСчив Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Β«+Β» Π½Π°Π΄ строковыми ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ (для ΠΈΡ… ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ); это Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ.

Π“Π»Π°Π²Π° 5. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ²

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ способы создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ срСдств Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Qt. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния подкласса ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt ΠΈΠ»ΠΈ ΠΏΡƒΡ‚Π΅ΠΌ опрСдСлСния нСпосрСдствСнно подкласса QWidget. ΠœΡ‹ продСмонстрируСм ΠΎΠ±Π° ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΈ ΠΌΡ‹ рассмотрим Ρ‚Π°ΠΊΠΆΠ΅ способы ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² Qt Designer, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ встроСнный Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Qt. ΠœΡ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠΌ Π΄Π°Π½Π½ΡƒΡŽ Π³Π»Π°Π²Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ двойная буфСризация β€” эффСктивный ΠΌΠ΅Ρ‚ΠΎΠ΄ быстрого рисования.

Настройка Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² Π±ΠΎΠ»Π΅Π΅ спСциализированной настройкС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‚ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ установки Π΅Π³ΠΎ свойств Π² Qt Designer ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ ΠΈ прямоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании подкласса ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π½ΠΎΠ³ΠΎ класса ΠΈ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄ наши трСбования.

Рис. 5.1. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ HexSpinBox.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это дСлаСтся, Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€Π½Ρ‹ΠΉ счСтчик. Наборный счСтчик QSpinBox ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ дСсятичныС Ρ†Π΅Π»Ρ‹Π΅ числа, Π½ΠΎ ΠΏΡƒΡ‚Π΅ΠΌ создания подкласса достаточно Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ значСния.

01 #ifndef HEXSPINBOX_H

02 #define HEXSPINBOX_H

03 #include <QSpinBox>

04 class QRegExpValidator;


05 class HexSpinBox : public QSpinBox

06 {

07 Q_OBJECT

08 public:

09 HexSpinBox(QWidget *parent = 0);

10 protected:

11 QValidator::State validate(QString &text, int &pos) const;

12 int valueFromText(const QString &text) const;

13 QString textFromValue(int value) const;

14 private:

15 QRegExpValidator *validator;

16 };

17 #endif

ШСстнадцатСричный Π½Π°Π±ΠΎΡ€Π½Ρ‹ΠΉ счСтчик HexSpinBox наслСдуСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚ QSpinBox. Он содСрТит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ конструктор ΠΈ пСрСопрСдСляСт Ρ‚Ρ€ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса QSpinBox.

01 #include <QtGui>

02 #include "hexspinbox.h"

03 HexSpinBox::HexSpinBox(QWidget *parent)

04 : QSpinBox(parent)

05 {

06 setRange(0, 255);

07 validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);

08 }

ΠœΡ‹ устанавливаСм ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ 255 (ΠΎΡ‚ 0x00 Π΄ΠΎ 0xFF), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΡƒΡ‡ΡˆΠ΅ соотвСтствуСт ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Π½ΠΎΠΌΡƒ счСтчику, Ρ‡Π΅ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ 0 Π΄ΠΎ 99, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² QSpinBox.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика, щСлкая ΠΏΠΎ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ стрСлкС ΠΈΠ»ΠΈ вводя значСния Π² строкС рСдактирования Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика. Π’ послСднСм случаС ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ числа. Для достиТСния этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ QRegExpValidator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько символов со значСниями ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°Ρ… ΠΎΡ‚ Β«0Β» Π΄ΠΎ Β«9Β», ΠΎΡ‚ «А» Π΄ΠΎ Β«FΒ» ΠΈΠ»ΠΈ ΠΎΡ‚ Β«Π°Β» Π΄ΠΎ Β«fΒ».

09 QValidator::State HexSpinBox::validate(QString &text, int &pos) const

10 {

11 return validator->validate(text, pos);

12 }

Π­Ρ‚Π° функция вызываСтся Π² QSpinBox для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ допустимости Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ тСкста. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: Invalid (тСкст Π½Π΅ соотвСтствуСт рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ), Intermediate (тСкст, вСроятно, являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ допустимого значСния) ΠΈ Acceptable (тСкст допустим). QRegExpValidator ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ validate(), поэтому ΠΌΡ‹ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ Π²Ρ‹Π·ΠΎΠ²Π°. ВСорСтичСски слСдуСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Invalid ΠΈΠ»ΠΈ Intermediate для Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π²Π½Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика, Π½ΠΎ QSpinBox достаточно Β«ΡƒΠΌΠ΅Π½Β» ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

13 QString HexSpinBox::textFromValue(int value) const

14 {

15 return QString::number(value, 16).toUpper();

16 }

Ѐункция textFromValue() ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число Π² строку. QSpinBox Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΅ для обновлСния строки рСдактирования Π² Π½Π°Π±ΠΎΡ€Π½ΠΎΠΌ счСтчикС, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ клавиши Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ стрСлки Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QString::number(), задавая 16 Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° для прСобразования значСния Π² прСдставлСнноС Π² Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ число, ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QString::toUpper() для прСобразования Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ рСгистр.

17 int HexSpinBox::valueFromText(const QString &text) const

18 {

19 bool ok;

20 return text.toInt(&ok, 16);

21 }

Ѐункция valueFromText() выполняСт ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· строки Π² Ρ†Π΅Π»ΠΎΠ΅ число. Она вызываСтся Π² QSpinBox, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² строку рСдактирования Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Enter. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QString::toInt() для ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ прСобразования Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ тСкстового значСния (Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ QSpinBox::text()) Π² Ρ†Π΅Π»ΠΎΠ΅ число, вновь ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ 16 Π² качСствС Π±Π°Π·Ρ‹. Если строка Π½Π΅ являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌ числом, ok устанавливаСтся Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false ΠΈ toInt() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0. Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ нСобходимости Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ функция (validator) позволяСт Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ значСния. ВмСсто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ok ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ toInt().

Π­Ρ‚ΠΈΠΌ ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈ созданиС ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π½ΠΎΠ³ΠΎ счСтчика. Настройка Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt осущСствляСтся ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ†Ρƒ: ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ подходящий Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Qt, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ подкласс ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для измСнСния Ρ€Π΅ΠΆΠΈΠΌΠ° Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

БозданиС подкласса QWidget

МногиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ простой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π»ΠΈΠ±ΠΎ встроСнных Π² Qt, Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ HexSpinBox). Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ строятся Π½Π° основС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Ρ‚ΠΎ ΠΎΠ½ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² Qt Designer.

β€’ создайтС Π½ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ шаблон Β«WidgetΒ» (Π²ΠΈΠ΄ΠΆΠ΅Ρ‚);

β€’ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² эту Ρ„ΠΎΡ€ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈ Π·Π°Ρ‚Π΅ΠΌ располоТитС ΠΈΡ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ;

β€’ установитС соСдинСния сигналов ΠΈ слотов;

β€’ Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ нСльзя ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сигналов ΠΈ слотов, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ слСдуСт ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ наслСдуСт ΠΊΠ°ΠΊ класс QWidget, Ρ‚Π°ΠΊ ΠΈ класс, сгСнСрированный компилятором uic.

ЕстСствСнно, комбинация ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠŸΡ€ΠΈ любом ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ класс наслСдуСт нСпосрСдствСнно QWidget.

Если Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ своих собствСнных сигналов ΠΈ слотов ΠΈ Π½Π΅ пСрСопрСдСляСт Π½ΠΈΠΊΠ°ΠΊΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ², Π½Π΅ создавая подкласс. Π­Ρ‚ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΌΡ‹ пользовались Π² Π³Π»Π°Π²Π΅ 1 для создания прилоТСния Age с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ QWidget, QSpinBox ΠΈ QSlider. Π”Π°ΠΆΠ΅ Π² этом случаС ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π»Π΅Π³ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ подкласс QWidget ΠΈ Π² Π΅Π³ΠΎ конструкторС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ QSpinBox ΠΈ QSlider.

Когда ΠΏΠΎΠ΄ Ρ€ΡƒΠΊΠΎΠΉ Π½Π΅Ρ‚ подходящих Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt ΠΈ ΠΊΠΎΠ³Π΄Π° нСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, комбинируя ΠΈ адаптируя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ всС ΠΆΠ΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. Π­Ρ‚ΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ создания подкласса QWidget ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… событий, связанных с рисованиСм Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° Ρ‰Π΅Π»Ρ‡ΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΌΡ‹ свободно ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠ°ΠΊ внСшним Π²ΠΈΠ΄ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ нашСго Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π’Π°ΠΊΠΈΠ΅ встроСнныС Π² Qt Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹, ΠΊΠ°ΠΊ QLabel, QPushButton ΠΈ QTableWidget, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ. Если Π±Ρ‹ ΠΈΡ… Π½Π΅ Π±Ρ‹Π»ΠΎ Π² Qt, всС ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ прСдусмотрСнных Π² классС QWidget ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½ΡƒΡŽ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Для дСмонстрации Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΏΡ€ΠΈ написании ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΌΡ‹ создадим Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π½Π° рис. 5.2. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ рСдактирования ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ.