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

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

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

80 void IconEditor::mouseMoveEvent(QMouseEvent *event)

81 {

82 if (event->buttons() & Qt::LeftButton) {

83 setImagePixel(event->pos(), true);

84 } else if (event->buttons() & Qt::RightButton) {

85 setImagePixel(event->pos(), false);

86 }

87 }

Ѐункция mouseMoveEvent() ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ события Β«ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΊΠΈΒ». По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ эти события Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ. МоТно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QWidget::setMouseTracking(), Π½ΠΎ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Как ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΊΠΈ устанавливаСтся ΠΈΠ»ΠΈ стираСтся пиксСль, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Π½ΠΈΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π°Π΄ пиксСлСм Ρ‚ΠΎΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ ΡΡ‚ΠΈΡ€Π°Ρ‚ΡŒΡΡ пиксСль. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ допускаСтся ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π°ΠΆΠ°Ρ‚Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСсколько ΠΊΠ½ΠΎΠΏΠΎΠΊ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QMouseEvent::buttons() Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдставляСт собой Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ логичСской ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ поразрядного Π˜Π›Π˜ для ΠΊΠ½ΠΎΠΏΠΎΠΊ. ΠœΡ‹ провСряСм Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° & ΠΈ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ состояния Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setImagePixel().

88 void IconEditor::setImagePixel(const QPoint &pos, bool opaque)

89 {

90 int i = pos.x() / zoom;

91 int j = pos.y() / zoom;

92 if (image.rect().contains(i, j)) {

93 if (opaque) {

94 image.setPixel(i, j, penColor().rgba());

95 } else {

96 image.setPixel(i, j, qRgba(0, 0, 0, 0));

97 }

98 update(pixelRect(i, j));

99 }

100 }

Ѐункция setImagePixel() вызываСтся ΠΈΠ· mousePressEvent() ΠΈ mouseMoveEvent() для установки ΠΈΠ»ΠΈ стирания пиксСля. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ pos опрСдСляСт ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΊΠΈ Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅.

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС Π½Π°Π΄ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΡ‹ΡˆΠΊΠΈ ΠΈΠ· систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ изобраТСния. Π­Ρ‚ΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ дСлСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ полоТСния ΠΌΡ‹ΡˆΠΊΠΈ x() ΠΈ y() Π½Π° коэффициСнт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ провСряСм ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² Π½ΡƒΠΆΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ QImage::rect() ΠΈ QRect::contains(); фактичСски здСсь провСряСтся ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ i Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ image.width() β€” 1, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ j β€” Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ image.height() β€” 1.

Π’ зависимости ΠΎΡ‚ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° opaque ΠΌΡ‹ устанавливаСм ΠΈΠ»ΠΈ стираСм пиксСль Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. ΠŸΡ€ΠΈ стирании пиксСль фактичСски становится ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ. Для Π²Ρ‹Π·ΠΎΠ²Π° QImage::setPixel() ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€ΠΎ QColor Π² 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ARGB. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ update() с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QRect, Π·Π°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пСрСрисовки.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ рассмотрСны Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈβ€”Ρ‡Π»Π΅Π½Ρ‹, ΠΌΡ‹ вСрнСмся ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΌΡƒ Π² конструкторС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ Qt::WA_StaticContents. Π­Ρ‚ΠΎΡ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Qt Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ содСрТимоС Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π½Π΅ измСняСтся ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈ Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» остаСтся Π½Π° ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌ мСстС. Qt ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ лишний Ρ€Π°Π· Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΡƒΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ Π΅Π³ΠΎ области.

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

Рис. 5.5. ИзмСнСниС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt::WA_StaticContents.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ построСн. На основС примСнСния ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… свСдСний ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor Π±ΡƒΠ΄Π΅Ρ‚ сам ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΎΠΊΠ½ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² качСствС Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΎΠΊΠ½Π΅ QMainWindow, Π² качСствС Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΈΠ»ΠΈ Π² качСствС Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QScrollArea. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим способы Π΅Π³ΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π² Qt Designer.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π² Qt Designer

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ смоТСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ Π² Qt Designer, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Qt Designer Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΈΡ…. Для этого сущСствуСт Π΄Π²Π° способа: ΠΌΠ΅Ρ‚ΠΎΠ΄ «продвиТСния» (promotion) ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (plugin).

ΠœΠ΅Ρ‚ΠΎΠ΄ продвиТСния являСтся самым быстрым ΠΈ самым простым. Он Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ встроСнного Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° Π² Qt Designer Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. ВпослСдствии этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ…, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Qt Designer, Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ»ΠΈ просмотрС ΠΎΠ½ отобраТаСтся просто Π² Π²ΠΈΠ΄Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ встроСнного Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt.

НиТС приводится порядок дСйствий ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° HexSpinBox:

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π½Π°Π±ΠΎΡ€Π½Ρ‹ΠΉ счСтчик QSpinBox, пСрСтаскивая Π΅Π³ΠΎ с ΠΏΠ°Π½Π΅Π»ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt Designer Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ.

2. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΎΠΉ клавишСй ΠΌΡ‹ΡˆΠΊΠΈ ΠΏΠΎ Π½Π°Π±ΠΎΡ€Π½ΠΎΠΌΡƒ счСтчику ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚ контСкстного мСню Promote to Custom Widget (ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚).

3. Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π² появившСмся Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΏΠΎΠ»Π΅ названия класса Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Β«HexSpinBoxΒ» ΠΈ ΠΏΠΎΠ»Π΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Β«hexspinbox.hΒ».

Π’ΠΎΡ‚ ΠΈ всС! Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ компилятором uic ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ #include hexspinbox.h вмСсто <QSpinBox> ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ HexSpinBox. Π’ Qt Designer Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ HexSpinBox Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСн Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ QSpinBox, позволяя Π½Π°ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ свойства QSpinBox (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅).

Рис. 5.6. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Qt Designer.

НСдостатками ΠΌΠ΅Ρ‚ΠΎΠ΄Π° продвиТСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ Π² Qt Designer свойств, Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Ρ… для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ прСдставляСтся Π² QtDesigner Π½Π΅ своим ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ОбС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

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

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ подкласс QDesignerCustomWidgetInterface ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ нСсколько Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ исходный Ρ„Π°ΠΉΠ» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ модуля располоТСн Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ iconeditorplugin, Π° исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ IconEditor располоТСн Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ iconeditor.

НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса:

01 #include <QDesignerCustomWidgetInterface>

02 class IconEditorPlugin : public QObject,

03 public QDesignerCustomWidgetInterface

04 {

05 Q_OBJECT

06 Q_INTERFACES(QDesignerCustomWidgetInterface)

07 public:

08 IconEditorPlugin(QObject *parent = 0);

09 QString name() const;

10 QString includeFile() const;

11 QString group() const;

12 QIcon icon() const;

13 QString toolTip() const;

14 QString whatsThis() const;

15 bool isContainer() const;

16 QWidget *createWidget(QWidget *parent);

17 };

Подкласс IconEditorPlugin являСтся Ρ„Π°Π±Ρ€ΠΈΠΊΠΎΠΉ класса (factory class), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулируСт Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor. Он являСтся наслСдником классов QObject ΠΈ QDesignerCustomWidgetIterface ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ макрос Q_INTERFACES(), указывая компилятору moc Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс прСдставляСт собой ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹ΠΉ интСрфСйс. Π•Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Qt Designer для создания экзСмпляров класса ΠΈ получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½Π΅ΠΌ.

01 IconEditorPlugin::IconEditorPlugin(QObject *parent)

02 : QObject(parent)

03 {

04 }

IconEditorPlugin ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ конструктор.

05 QString IconEditorPlugin::name() const

06 {

07 return "IconEditor";

08 }

Ѐункция name() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

09 QString IconEditorPlugin::includeFile() const

10 {

11 return "iconeditor.h";

12 }

Ѐункция includeFile() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ имя Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инкапсулирован Π² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, сгСнСрированный компилятором uic.