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

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

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

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

Рис. 5.2. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ IconEditor.

Π‘Π½Π°Ρ‡Π°Π»Π° рассмотрим Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

01 #ifndef ICONEDITOR_H

02 #define ICONEDITOR_H

03 #include <QColor>

04 #include <QImage>

05 #include <QWidget>


06 class IconEditor : public QWidget

07 {

08 Q_OBJECT

09 Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)

10 Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)

11 Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)


12 public:

13 IconEditor(QWidget *parent = 0);

14 void setPenColor(const QColor &newColor);

15 QColor penColor() const { return curColor; }

16 void setIconImage(const QImage &newImage);

17 QImage iconImage() const { return image; }

18 QSize sizeHint() const;

19 void setZoomFactor(int newZoom);

20 int zoomFactor() const { return zoom; }

Класс IconEditor ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ макрос Q_PROPERTY() для объявлСния Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… свойств: penColor, iconImage ΠΈ zoomFactor. КаТдоС свойство ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ «чтСния» ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ «записи». НапримСр, свойство penColor ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QColor ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ penColor() ΠΈ setPenColor().

Когда ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π² Qt Designer, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ свойства ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ свойств Qt Designer Π½ΠΈΠΆΠ΅ свойств, унаслСдованных ΠΎΡ‚ QWidget. Бвойства ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ QVariant. ΠœΠ°ΠΊΡ€ΠΎΡ Q_OBJECT Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для классов, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ свойства.

21 protected:

22 void mousePressEvent(QMouseEvent *event);

23 void mouseMoveEvent(QMouseEvent *event);

24 void paintEvent(QPaintEvent *event);


25 private:

26 void setImagePixel(const QPoint &pos, bool opaque);

27 QRect pixelRect(int i, int j) const;

28 QColor curColor;

29 QImage image;

30 int zoom;

31 };

32 #endif

IconEditor пСрСопрСдСляСт Ρ‚Ρ€ΠΈ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QWidget ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π’ Ρ‚Ρ€Π΅Ρ… Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… содСрТатся значСния Ρ‚Ρ€Π΅Ρ… свойств.

Π€Π°ΠΉΠ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса начинаСтся с конструктора IconEditor:

01 #include <QtGui>

02 #include "iconeditor.h"

03 IconEditor::IconEditor(QWidget *parent)

04 : QWidget(parent)

05 {

06 setAttribute(Qt::WA_StaticContents);

07 setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);

08 curColor = Qt::black;

09 zoom = 8;

10 image = QImage(16, 16, QImage::Format_ARGB32);

11 image.fill(qRgba(0, 0, 0, 0));

12 }

Π’ конструкторС имССтся нСсколько Ρ‚ΠΎΠ½ΠΊΠΈΡ… ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², связанных с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Qt::WA_StaticContents ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ setSizePolicy(). ВскорС ΠΌΡ‹ обсудим ΠΈΡ….

УстанавливаСтся Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π°. ΠšΠΎΡΡ„Ρ„ΠΈΡ†ΠΈΠ΅Π½Ρ‚ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ изобраТСния (zoom factor) устанавливаСтся Π½Π° 8, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ прСдставляСтся ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠΌ 8 Γ— 8.

Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ хранятся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉβ€”Ρ‡Π»Π΅Π½Π΅ image, ΠΈ доступ ΠΊ Π½ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ setIconImage() ΠΈ iconImage(). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° рСдактирования ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setIconImage() ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ iconImage() для считывания ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· памяти, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ Π΅Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ image ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QImage. ΠœΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π΅Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ Π² 16 Γ— 16 пиксСлСй ΠΈ Π½Π° 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ARGB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. ΠœΡ‹ ΠΎΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ изобраТСния, устанавливая ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ прозрачности.

Бпособ хранСния изобраТСния Π² классС QImage Π½Π΅ зависит ΠΎΡ‚ оборудования. ΠŸΡ€ΠΈ этом Π΅Π³ΠΎ Π³Π»ΡƒΠ±ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° 1, 8 ΠΈΠ»ΠΈ 32 Π±ΠΈΡ‚Π°. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ с 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎ 8 Π±ΠΈΡ‚ Π½Π° красный, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΈ синий ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ пиксСля. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… 8 Π±ΠΈΡ‚Π°Ρ… хранится Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ пиксСля (ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π΅Π³ΠΎ прозрачности). НапримСр, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ красный, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΈ синий «чистого» красного Ρ†Π²Π΅Ρ‚Π° ΠΈ Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠΌΠ΅ΡŽΡ‚ значСния 255, 0, 0 ΠΈ 255. Π’ Qt этот Ρ†Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

QRgb red = qRgba(255, 0, 0, 255);

ΠΈΠ»ΠΈ Ρ‚Π°ΠΊ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот Ρ†Π²Π΅Ρ‚ Π½Π΅ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π΅Π½):

QRgb red = qRgb(255, 0, 0);

Π’ΠΈΠΏ QRgb просто синоним Ρ‚ΠΈΠΏΠ° unsigned int, созданный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ typedef, a qRgb() ΠΈ qRgba() ΡΠ²Π»ΡΡŽΡ‚ΡΡ встроСнными функциями (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ со спСцификатором inline), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ свои Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число. ДопускаСтся Ρ‚Π°ΠΊΠΆΠ΅ запись

QRgb red = 0xFFFF0000;

Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ FF ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, Π° Π²Ρ‚ΠΎΡ€Ρ‹Π΅ FF β€” красному ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ. Π’ конструкторС класса IconEditor ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ QImage ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ 0 Π² качСствС значСния Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

Π’ Qt для хранСния Ρ†Π²Π΅Ρ‚ΠΎΠ² прСдусмотрСно Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: QRgb ΠΈ QColor. Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ QRgb всСго лишь опрСдСляСтся Π² QImage ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом typedef для прСдставлСния пиксСлСй 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, QColor являСтся классом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Qt для хранСния Ρ†Π²Π΅Ρ‚ΠΎΠ². Π’ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ IconEditor ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ QRgb Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с QImage; ΠΌΡ‹ примСняСм QColor Π²ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаях, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ свойство Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π° penColor.

13 QSize IconEditor::sizeHint() const

14 {

15 QSize size = zoom * image.size();

16 if (zoom >= 3)

17 size += QSize(1, 1);

18 return size;

19 }

Ѐункция sizeHint() класса QWidget пСрСопрСдСляСтся ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Β«ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉΒ» Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Π½Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ коэффициСнт ΠΈ Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ коэффициСнт Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ большС 3, добавляСм Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ пиксСль ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ для размСщСния сСтки. (ΠœΡ‹ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ сСтку ΠΏΡ€ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠΌ коэффициСнтС 1 ΠΈΠ»ΠΈ 2, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этом случаС Π΅Π΄Π²Π° Π»ΠΈ найдСтся мСсто для пиксСлСй ΠΏΠΈΠΊΡ‚ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.)

Π˜Π΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π·Π°ΠΌΠ΅Ρ‚Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Qt ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ максимально ΡƒΡ‡Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ². Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ IconEditor Π±Ρ‹Π» ΡƒΠ΄ΠΎΠ±Π΅Π½ для ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ свой ΠΏΡ€Π°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€.

ΠšΡ€ΠΎΠΌΠ΅ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Β«ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Β», которая Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ систСмС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ»ΠΈ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΅Π³ΠΎ растяТСния ΠΈΠ»ΠΈ сТатия. Вызывая Π² конструкторС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setSizePolicy() со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ QSizePolicy::Minimum Π² качСствС Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ этого Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ являСтся фактичСски Π΅Π³ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΡ€ΠΈ нСобходимости Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΡ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ ΠΎΠ½ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΆΠΈΠΌΠ°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΌΠ΅Π½ΡŒΡˆΠΈΡ…, Ρ‡Π΅ΠΌ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ. ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² Qt Designer ΠΏΡƒΡ‚Π΅ΠΌ установки свойства Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° sizePolicy. Бмысл Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 6 (Β«Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉΒ»).

20 void IconEditor::setPenColor(const QColor &newColor)

21 {

22 curColor = newColor;

23 }

Ѐункция setPenColor() устанавливаСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π°. Π­Ρ‚ΠΎΡ‚ Ρ†Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° экран Π½ΠΎΠ²Ρ‹Ρ… пиксСлСй.

24 void IconEditor::setIconImage(const QImage &newImage)

25 {

26 if (newImage != image) {

27 image = newImage.convertToFormat(QImage::Format_ARGB32);

28 update();

29 updateGeometry();

30 }

31 }

Ѐункция setIconImage() Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для рСдактирования. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ convertToFormat() для установки 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ изобраТСния с Π°Π»ΡŒΡ„Π°β€”Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ, Ссли это Π΅Ρ‰Π΅ Π½Π΅ сдСлано. Π’ дальнСйшСм Π²Π΅Π·Π΄Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ хранится Π² 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ… элСмСнтах Ρ‚ΠΈΠΏΠ° ARGB.

ПослС установки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ image ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QWidget::update() для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСрисовки Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° с Π½ΠΎΠ²Ρ‹ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ QWidget::updateGeometry(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ всСм содСрТащим этот Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Π Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊ Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ.

32 void IconEditor::setZoomFactor(int newZoom)

33 {

34 if (newZoom < 1)

35 newZoom = 1;

36 if (newZoom != zoom) {

37 zoom = newZoom;

38 update();

39 updateGeometry();

40 }

41 }

Ѐункция setZoomFactor() устанавливаСт ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ коэффициСнт изобраТСния. Для прСдотвращСния дСлСния Π½Π° Π½ΡƒΠ»ΡŒ ΠΌΡ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ всякоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, мСньшСС, Ρ‡Π΅ΠΌ 1. ΠœΡ‹ ΠΎΠΏΡΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ update() ΠΈ updateGeometry() для пСрСрисовки Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ увСдомлСния всСх ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.