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

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

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

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() для пСрСрисовки Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ увСдомлСния всСх ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ идСального Ρ€Π°Π·ΠΌΠ΅Ρ€Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ penColor(), iconImage() ΠΈ zoomFactor() Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΊΠ°ΠΊ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ paintEvent(). Π­Ρ‚Π° функция ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ Π² классС IconEditor. Она вызываСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΏΠ΅Ρ€Π΅Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅Π΅ рСализация Π² QWidget Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚, оставляя Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ пустым.

Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ рассмотрСнная Π½Π°ΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 3 функция closeEvent(), функция paintEvent() являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ события. Π’ Qt прСдусмотрСно ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… относится ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ события. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассматриваСтся Π² Π³Π»Π°Π²Π΅ 7.

БущСствуСт мноТСство ситуаций, ΠΊΠΎΠ³Π΄Π° гСнСрируСтся событиС рисования (paint) ΠΈ вызываСтся функция paintEvent():

β€’ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° экран Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° систСма автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС рисования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ нарисовал сам сСбя;

β€’ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° систСма Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС рисования;

β€’ Ссли Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ пСрСкрываСтся Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΎΠΊΠ½ΠΎΠΌ ΠΈ Π·Π°Ρ‚Π΅ΠΌ вновь оказываСтся Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ, гСнСрируСтся событиС рисования для областСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π»ΠΈΡΡŒ (Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ систСма управлСния ΠΎΠΊΠ½Π°ΠΌΠΈ Π½Π΅ сохранит Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ).

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ событиС рисования ΠΏΡƒΡ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QWidget::update() ΠΈΠ»ΠΈ QWidget::repaint(). Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ этими функциями ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: repaint() ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ пСрСрисовкС, Π° функция update() просто ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ событиС рисования Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событий, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Qt. (ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ Π½Π° экранС.) Если update() вызываСтся нСсколько Ρ€Π°Π·, Qt ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ событий рисования Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ событиС для прСдотвращСния мСрцания. Π’ классС IconEditor ΠΌΡ‹ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ update().

НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:

42 void IconEditor::paintEvent(QPaintEvent *event)

43 {

44 QPainter painter(this);

45 if (zoom >= 3) {

46 painter.setPen(palette().foreground().color());

47 for (int i = 0; i <= image.width(); ++i)

48 painter.drawLine(zoom * i, 0,

49 zoom * i, zoom * image.height());

50 for (int j = 0; j <= image.height(); ++j)

51 painter.drawLine(0, zoom * j,

52 zoom * image.width(), zoom * j);

53 }


54 for (int i = 0; i < image.width(); ++i) {

55 for (int j = 0; j < image.height(); ++j) {

56 QRect rect = pixelRect(i, j);

57 if (!event->region().intersect(rect).isEmpty()) {

58 QColor color = QColor::fromRgba(image.pixel(i, j));

59 painter.fillRect(rect, color);

60 }

61 }

62 }

63 }

ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ с построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QPainter нашСго Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. Если ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Ρ‹ΠΉ коэффициСнт Ρ€Π°Π²Π΅Π½ ΠΈΠ»ΠΈ большС 3, ΠΌΡ‹ Π²Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QPainter::drawLine() Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ сСтки.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QPainter::drawLine() ΠΈΠΌΠ΅Π΅Ρ‚ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚:

painter.drawLine(x1, y1, x2, y2);

Π³Π΄Π΅ (x1, y1) Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ†Π° Π»ΠΈΠ½ΠΈΠΈ ΠΈ (x2, y2) Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ†Π° Π»ΠΈΠ½ΠΈΠΈ. БущСствуСт ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° QPoint вмСсто Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл.

ПиксСль Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Qt ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (0, 0), Π° пиксСль Π² Π½ΠΈΠΆΠ½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (width() β€” 1, height() β€” 1). Π­Ρ‚ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Π΄Π΅ΠΊΠ°Ρ€Ρ‚ΠΎΠ²ΡΠΊΡƒΡŽ систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡƒΡŽ свСрху Π²Π½ΠΈΠ·. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π² QPainter, трансформируя Π΅Π΅ Ρ‚Π°ΠΊΠΈΠΌΠΈ способами, ΠΊΠ°ΠΊ смСщСниС, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ отсСчСниС. Π­Ρ‚ΠΈ вопросы Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² Π³Π»Π°Π²Π΅ 8 (Β«Π“Ρ€Π°Ρ„ΠΈΠΊΠ° 2D ΠΈ 3DΒ»).

Рис. 5.3. Π’Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QPainter.

ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Π² QPainter Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ drawLine() ΠΌΡ‹ устанавливаСм Ρ†Π²Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setPen(). ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ТСстко Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ сСрый), Π½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ, которая опрСдСляСт Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚ΠΎΠ². НапримСр, прСдусмотрСн Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ свСтло—сСрый) ΠΈ Ρ†Π²Π΅Ρ‚ тСкста Π½Π° этом Ρ„ΠΎΠ½Π΅ (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ°Π»ΠΈΡ‚Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄ схСму Ρ†Π²Π΅Ρ‚ΠΎΠ² ΠΎΠΊΠΎΠ½Π½ΠΎΠΉ систСмы. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ†Π²Π΅Ρ‚Π° ΠΈΠ· ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, ΠΌΡ‹ обСспСчим Π² IconEditor ΡƒΡ‡Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… настроСк.

ΠŸΠ°Π»ΠΈΡ‚Ρ€Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… Π³Ρ€ΡƒΠΏΠΏ: Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ, Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΈ Π½Π΅Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ. ЦвСтовая Π³Ρ€ΡƒΠΏΠΏΠ° выбираСтся Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°:

β€’ Π³Ρ€ΡƒΠΏΠΏΠ° Active ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°;

β€’ Π³Ρ€ΡƒΠΏΠΏΠ° Inactive ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΊΠΎΠ½;

β€’ Π³Ρ€ΡƒΠΏΠΏΠ° Disabled ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°ΠΌΠΈ любого ΠΎΠΊΠ½Π°.

Ѐункция QWidget::palette() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QPalette. Π¦Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ элСмСнты пСрСчислСния Ρ‚ΠΈΠΏΠ° QPalette::QColorGroup. Удобная функция QWidget::colorGroup() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΡƒΡŽ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ состояния Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, ΠΈ поэтому Π½Π°ΠΌ Ρ€Π΅Π΄ΠΊΠΎ придСтся Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ нСпосрСдствСнно ΠΈΠ· ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹.

Когда Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΈΡΡ‚ΡŒ ΠΈΠ»ΠΈ Ρ†Π²Π΅Ρ‚ для рисования, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ связан с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QWidget::palette(), ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ€ΠΎΠ»Π΅Π²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QPalette::foreground(). КаТдая ролСвая функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΈΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈ трСбуСтся, ΠΎΠ΄Π½Π°ΠΊΠΎ Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ†Π²Π΅Ρ‚, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· кисти, ΠΊΠ°ΠΊ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ Π² paintEvent(). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ кисти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°, поэтому Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ.

Ѐункция paintEvent() Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ рисованиС изобраТСния. Π’Ρ‹Π·ΠΎΠ² IconEditor::pixelRect() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ QRect, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΎΠ±Π»Π°ΡΡ‚ΡŒ пСрСрисовки. ΠœΡ‹ Π½Π΅ Π²Ρ‹Π΄Π°Π΅ΠΌ пиксСли, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ области, обСспСчивая ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ.

Рис. 5.4. Π’Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QPainter.

ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ QPainter::fillRect() для Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экран ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ пиксСля. QPainter::fillRect() ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ QRect ΠΈ QBrush. ΠŸΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ QColor Π² качСствС кисти, ΠΌΡ‹ обСспСчиваСм Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ области.

64 QRect IconEditor::pixelRect(int i, int j) const

65 {

66 if (zoom >= 3) {

67 return QRect(zoom * i + 1, zoom * j + 1, zoom - 1, zoom - 1);

68 } else {

69 return QRect(zoom * i, zoom * j, zoom, zoom);

70 }

71 }

Ѐункция pixelRect() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QRect, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QPainter::fillRect(). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ i ΠΈ j ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ пиксСля Π² QImage, Π° Π½Π΅ Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. Если коэффициСнт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π°Π²Π΅Π½ 1, ΠΎΠ±Π΅ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ QRect ΠΈΠΌΠ΅Π΅Ρ‚ синтаксис QRect(x, Ρƒ, width, height), Π³Π΄Π΅ (x, Ρƒ) ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, a width ΠΈ height ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ ΠΈ высотой). Если коэффициСнт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π°Π²Π΅Π½ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ 3, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π° ΠΎΠ΄ΠΈΠ½ пиксСль ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°Π³ΠΎΡ€Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ сСтки.

72 void IconEditor::mousePressEvent(QMouseEvent *event)

73 {

74 if (event->button() == Qt::LeftButton) {

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

76 } else if (event->button() == Qt::RightButton) {

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

78 }

79 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, систСма Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ событиС «клавиша ΠΌΡ‹ΡˆΠΊΠΈ Π½Π°ΠΆΠ°Ρ‚Π°Β» (mouse press). ΠŸΡƒΡ‚Π΅ΠΌ пСрСопрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QWidget::mousePressEvent() ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ это событиС ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ пиксСль изобраТСния, находящийся ΠΏΠΎΠ΄ курсором ΠΌΡ‹ΡˆΠΊΠΈ.

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setImagePixel() c true Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, указывая Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ установки Ρ†Π²Π΅Ρ‚Π° пиксСля Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ†Π²Π΅Ρ‚ ΠΏΠ΅Ρ€Π°. Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠ°Π» ΠΏΡ€Π°Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setImagePixel(), Π½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ false для стирания пиксСля.