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

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

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

Π’ этом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π² Ρ†ΠΈΠΊΠ»Π΅ for имССтся нСзамСтная ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ, которая быстро стала Π±Ρ‹ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΉ, Ссли Π±Ρ‹ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ большС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ rotate() ΠΌΡ‹ фактичСски ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ прСобразования Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°, получая Π½ΠΎΠ²ΡƒΡŽ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ прСобразования. Ошибка округлСния чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π΅Ρ‰Π΅ большС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡƒΡ‚Π΅ΠΌ пСрСзаписи ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° с использованиСм save() ΠΈ restore() для сохранСния ΠΈ восстановлСния ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ:

41 for (int i = 0; i <= MaxMinutes; ++i) {

42 painter->save();

43 painter->rotate(-i * DegreesPerMinute);

44 if (i % 5 == 0) {

45 painter->setPen(thickPen);

46 painter->drawLine(0, -41, 0, -44);

47 painter->drawText(-15, -41, 30, 25,

48 Qt::AlignHCenter | Qt::AlignTop,

49 QString::number(i));

50 } else {

51 painter->setPen(thinPen);

52 painter->drawLine(0, -42, 0, -44);

53 }

54 painter->restore();

55 }

ΠŸΡ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ способС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° Π΄ΡƒΡ…ΠΎΠ²ΠΊΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ самим Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ (x, y), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sin() ΠΈ cos() для опрСдСлСния ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° окруТности. Но Ρ‚ΠΎΠ³Π΄Π° Π½Π°ΠΌ всС ΠΆΠ΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ пСрСнос ΠΈ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ для отобраТСния тСкста ΠΏΠΎΠ΄ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ.

ВысококачСствСнноС воспроизвСдСниС изобраТСния ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QImage

ΠŸΡ€ΠΈ рисовании ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ принятия компромиссных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скорости ΠΈ точности. НапримСр, Π² систСмах X11 ΠΈ Mac OS X рисованиС ΠΏΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ QWidget ΠΈΠ»ΠΈ ΠΏΠΎ пиксСльной ΠΊΠ°Ρ€Ρ‚Π΅ QPixmap основано Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ графичСского процСссора (paint engine). Π’ систСмС X11 это обСспСчиваСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ связь с Π₯—сСрвСром; ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ рисования, Π° Π½Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ изобраТСния. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ нСдостатком этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ возмоТности Qt ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€ΠΎΠ΄Π½Ρ‹ΠΌΠΈ для Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ срСдствами ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ:

β€’ Π² систСмС Π₯11 Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ сглаТиваниС Π»ΠΈΠ½ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π₯—сСрвСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ X Render;

β€’ Π² систСмС Mac OS X Ρ€ΠΎΠ΄Π½ΠΎΠΉ графичСский процСссор, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ сглаТиваниС Π»ΠΈΠ½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ рисования ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π² X11 ΠΈ Windows, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

Когда Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ Π²Π°ΠΆΠ½Π΅Π΅ эффСктивности, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ QImage ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° экран. Π’ этом случаС Qt всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ собствСнный Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ графичСский процСссор ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… получаСтся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΌ. ЕдинствСнноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ QImage, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ рисуСм, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ QImage::Format_RGB32 ΠΈΠ»ΠΈ QImage::Format_ARGB32_Premultiplied.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ ARGB32 (0xaarrggbb); ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ красный, Π·Π΅Π»Π΅Π½Ρ‹ΠΉ ΠΈ синий ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Β«ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ°ΡŽΡ‚ΡΡΒ» Π½Π° Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ значСния RGB, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ находятся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0x00 Π΄ΠΎ 0xFF, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ значСния ΠΎΡ‚ 0x00 Π΄ΠΎ значСния Π°Π»ΡŒΡ„Π°-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. НапримСр, синий Ρ†Π²Π΅Ρ‚ с ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ 50% прСдставляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0x7F0000FF Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ARGB32, Π½ΠΎ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0x7F00007F Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ARGB32 с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΈ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‚Π΅ΠΌΠ½ΠΎ-Π·Π΅Π»Π΅Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ с ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ 75% ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0x3F008000 Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ARGB32 ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0x3F002000 Π² Ρ„opΠΌaΡ‚e ARGB32 с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сглаТиваниС Π»ΠΈΠ½ΠΈΠΉ ΠΏΡ€ΠΈ рисовании Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΄Π°ΠΆΠ΅ Π² систСмах X11, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ X Render. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий paintEvent(), ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ X Render для сглаТивания Π»ΠΈΠ½ΠΈΠΉ, ΠΌΠΎΠ³ Π±Ρ‹ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

01 void MyWidget::paintEvent(QPaintEvent *event)

02 {

03 QPainter painter(this);

04 painter.setRenderHint(QPainter::Antialiasing, true);

05 draw(&painter);

06 }

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ paintEvent() для примСнСния нСзависимого ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ графичСского процСссора Qt:

01 void MyWidget::paintEvent(QPaintEvent *event)

02 {

03 QImage image(size(), QImage::Format_ARGB32_Premultiplied);

04 QPainter imagePainter(&image);

05 imagePainter.initFrom(this);

06 imagePainter.setRenderHint(QPainter::Antialiasing, true);

07 imagePainter.eraseRect(rect());

08 draw(&imagePainter);

09 imagePainter.end();

10 QPainter widgetPainter(this);

11 widgetPainter.drawImage(0,0, image);

12 }

ΠœΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QImage с Ρ‚Π΅ΠΌ ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚, Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ARGB32 с ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPainter для рисования ΠΏΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ. Π’Ρ‹Π·ΠΎΠ² initFrom() ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π² Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ΅ ΠΏΠ΅Ρ€ΠΎ, Ρ„ΠΎΠ½ ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚ значСниями, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠΌ. ΠœΡ‹ рисуСм, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QPainter ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π° Π² ΠΊΠΎΠ½Ρ†Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPainter для копирования изобраТСния Π½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚.

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π΄Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ высококачСствСнный Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ воспроизвСдСния ΡˆΡ€ΠΈΡ„Ρ‚Π°, Ρ‡Ρ‚ΠΎ зависит ΠΎΡ‚ установлСнных Π² систСмС ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ².

ОсобСнно эффСктивным срСдством графичСского процСссора Qt являСтся Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π΅ΠΆΠΈΠΌΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π­Ρ‚ΠΈ Ρ€Π΅ΠΆΠΈΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ способ слияния исходного ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ пиксСля ΠΏΡ€ΠΈ рисовании. Π­Ρ‚ΠΎ относится ΠΊΠΎ всСм опСрациям рисования, Π² Ρ‚ΠΎΠΌ числС относящимся ΠΊ ΠΏΠ΅Ρ€Ρƒ, кисти, Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

Π Π΅ΠΆΠΈΠΌΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся QImage::CompositionMode_SourceOver, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎ исходный пиксСль (Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рисуСтся Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚) налагаСтся ΠΏΠΎΠ²Π΅Ρ€Ρ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ пиксСля, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ исходного пиксСля опрСдСляСт ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΅Π³ΠΎ прозрачности. На рис. 8.11 ΠΏΠΎΠΊΠ°Π·Π°Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ рисования ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ Π±Π°Π±ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… тСстового шаблона ΠΏΡ€ΠΈ использовании Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠΎΠ².


Рис. 8.11. Π Π΅ΠΆΠΈΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ QPainter.

Π Π΅ΠΆΠΈΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QPainter::setCompositionMode(). НапримСр, Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QImage, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠΉ пиксСли Π±Π°Π±ΠΎΡ‡ΠΊΠΈ ΠΈ тСстового шаблона с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ XOR:

QImage resultImage = checkerPatternImage;

QPainter painter(&resultImage);

painter.setCompositionMode(QPainter::CompositionMode_Xor);

painter.drawImage(0, 0, butterflyImage);

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ опСрация QImage::CompositionMode_Xor примСняСтся ΠΊ Π°Π»ΡŒΡ„Π°β€”ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ XOR ΠΏΡ€ΠΈ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π±Π΅Π»ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° (0xFFFFFFFF) Π½Π° Π±Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚ (0Ρ…00000000), Π° Π½Π΅ Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚(0Ρ…FF000000).

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство

Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство Π² Qt ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΠΎ QWidget, QPixmap ΠΈΠ»ΠΈ QImage. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ дСйствий ΠΏΡ€ΠΈ этом Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ:

1. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π² качСствС устройства рисования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPrinter.

2. Π’Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ Π½Π° экран Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ QPrintDialog, позволяя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ.

3. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPainter для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с QPrinter.

4. НарисуйтС страницу, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ QPainter.

5. Π’Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QPrinter::newPage() для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ страницу.

6. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠΉΡ‚Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ 4 ΠΈ 5 Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ распСчатаны всС страницы.

Π’ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах Windows ΠΈ Mac OS X QPrinter ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ систСмныС Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€ΠΎΠ². Π’ систСмС Unix ΠΎΠ½ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» PostScript ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ lp ΠΈΠ»ΠΈ lpr (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, установлСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ QPrinter::setPrintProgram()). QPrinter ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² PDF, Ссли Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ setOutputFormat(QPrinter::PdfFormat).

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с рассмотрСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ распСчаткС ΠΎΠ΄Π½ΠΎΠΉ страницы. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ распСчатываСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QImage:

01 void PrintWindow::printImage(const Qlmage &image)

02 {

03 QPrintDialog printDialog(&printer, this);

04 if (printDialog.exec()) {

05 QPainter painter(&printer);

06 QRect rect = painter.viewport();

07 QSize size = image.size();

08 size.scale(rect.size(), Qt::KeepAspectRatio);

09 painter.setViewport(rect.x(). rect.y(), size.width(), size.height());

10 painter.setWindow (image.rect());

11 painter.drawImage(0, 0, image);

12 }

13 }

Рис. 8.12. Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QImage.

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ класс PrintWindow ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽβ€”Ρ‡Π»Π΅Π½ printer Ρ‚ΠΈΠΏΠ° QPrinter. ΠœΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ просто ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ QPrinter Π² стСк Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ printImage(), Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΠ»ΠΈΡΡŒ Π±Ρ‹ настройки ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ.