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

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

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

Π’ Qt этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ примСнСния 0—миллисСкундного Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π°. Π’Π°ΠΉΠΌΠ΅Ρ€Ρ‹ этого Ρ‚ΠΈΠΏΠ° paΠ±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΈ отсутствии ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… событий. НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ timerEvent(), которая дСмонстрируСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π² состоянии ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠΈ:

01 void Spreadsheet::timerEvent(QTimerEvent *event)

02 {

03 if(event->timerId() == myTimerId) {

04 while (step < MaxStep &&

05 !qApp->hasPendingEvents()) {

06 performStep(step);

07 ++step;

08 }

09 } else {

10 QTableWidget::timerEvent(event);

11 }

12 }

Если Ρ„yнкция hasPendingEvents() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, ΠΌΡ‹ останавливаСм процСсс ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Qt. Π­Ρ‚ΠΎΡ‚ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Qt всСх своих ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… событий.

Π“Π»Π°Π²Π° 8. Π“Ρ€Π°Ρ„ΠΈΠΊΠ° 2D ΠΈ 3D

ΠžΡΠ½ΠΎΠ²Ρƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Qt срСдств Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ 2D составляСт класс QPainter (Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊ Qt). Π­Ρ‚ΠΎΡ‚ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для рисования гСомСтричСски Ρ„ΠΈΠ³ΡƒΡ€ (Ρ‚ΠΎΡ‡Π΅ΠΊ, Π»ΠΈΠ½ΠΈΠΉ, ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², эллипсов, Π΄ΡƒΠ³, сСгмСнтов ΠΈ сСкторов окруТности, ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² ΠΈ ΠΊΡ€ΠΈΠ²Ρ‹Ρ… Π‘Π΅Π·ΡŒΠ΅), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Ρ€Ρ‚, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ тСкста. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, QPainter ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ сглаТиваниС Π»ΠΈΠ½ΠΈΠΉ (antialiasing) ΠΏΡ€ΠΈ Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠΈ Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ Π±ΡƒΠΊΠ² Π² тСкстС, Π°Π»ΡŒΡ„Π°β€”ΡΠΌΠ΅ΡˆΠ΅Π½ΠΈΠ΅ (alpha blending), ΠΏΠ»Π°Π²Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Ρ†Π²Π΅Ρ‚ΠΎΠ² (gradient filling) ΠΈ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ графичСских элСмСнтов (vector paths). QPainter Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ 2D нСзависимой ΠΎΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ способности.

QPainter ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для вычСрчивания Π½Π° Ρ‚Π°ΠΊΠΈΡ… «устройствах рисования», ΠΊΠ°ΠΊ QWidget, QPixmap ΠΈΠ»ΠΈ QImage. QPainter ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρ‹ ΠΈΠ»ΠΈ классы ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… графичСских элСмСнтов с особым внСшним Π²ΠΈΠ΄ΠΎΠΌ ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Класс QPainter ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ совмСстно с QPrinter для Π²Ρ‹Π²ΠΎΠ΄Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅Π΅ устройство ΠΈ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² PDF. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° экран ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ².

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ классам QPainter ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ OpenGL. OpenGL являСтся стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ графичСских срСдств 2D ΠΈ 3D. ΠœΠΎΠ΄ΡƒΠ»ΡŒ QtOpenGL позволяСт ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ OpenGL Π² прилоТСния Qt.

РисованиС ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QPainter

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π½Π° устройствС рисования (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π²ΠΈΠ΄ΠΆΠ΅Ρ‚), ΠΌΡ‹ просто создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QPainter ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Π΅ΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° устройство. НапримСр:

void MyWidget::paintEvent(QPaintEvent *event)

{

QPainter painter(this);

…

}

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QPainter Π²ΠΈΠ΄Π° draw…(). На рис 8.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ….

Рис. 8.1. Часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ draw…() Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° QPainter.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки QPainter Π²Π»ΠΈΡΡŽΡ‚ Π½Π° Ρ€Π΅ΠΆΠΈΠΌ рисования. НСкоторыС ΠΈΠ· Π½ΠΈΡ… ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки устройства, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ВрСмя основными ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ настройки Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠ΅Ρ€ΠΎ, ΠΊΠΈΡΡ‚ΡŒ ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚:

β€’ ΠŸΠ΅Ρ€ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отобраТСния прямых Π»ΠΈΠ½ΠΈΠΉ ΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€ΠΎΠ² Ρ„ΠΈΠ³ΡƒΡ€. Оно ΠΈΠΌΠ΅Π΅Ρ‚ Ρ†Π²Π΅Ρ‚, Ρ‚ΠΎΠ»Ρ‰ΠΈΠ½Ρƒ, ΡΡ‚ΠΈΠ»ΡŒ Π»ΠΈΠ½ΠΈΠΈ, ΡΡ‚ΠΈΠ»ΡŒ окончания Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΡΡ‚ΠΈΠ»ΡŒ соСдинСния Π»ΠΈΠ½ΠΈΠΉ.

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

β€’ Π¨Ρ€ΠΈΡ„Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для отобраТСния тСкста. Π¨Ρ€ΠΈΡ„Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€.

Π­Ρ‚ΠΈ настройки ΠΌΠΎΠΆΠ½ΠΎ Π² любоС врСмя ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ setPen(), setBrush() ΠΈ setFont(), Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² QPen, QBrush ΠΈΠ»ΠΈ QFont.

Рис. 8.2. Π‘Ρ‚ΠΈΠ»ΠΈ окончания Π»ΠΈΠ½ΠΈΠΉ ΠΈ стили соСдинСния Π»ΠΈΠ½ΠΈΠΉ.

Рис. 8.3. Π‘Ρ‚ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π°.

Рис. 8.4. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Qt стили кисти.


Рис. 8.5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ гСомСтричСских Ρ„ΠΈΠ³ΡƒΡ€.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для вычСрчивания эллипса, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 8.5 (Π°):

QPainter painter(this);

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

painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));

painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));

painter.drawEllipse(80, 80, 400, 240);

Π’Ρ‹Π·ΠΎΠ² setRenderHint() Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ сглаТивания Π»ΠΈΠ½ΠΈΠΉ, указывая QPainter Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ использования ΠΏΠΎ краям Ρ†Π²Π΅Ρ‚ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ интСнсивности, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ искаТСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° края Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ пиксСлями. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ края Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ€ΠΎΠ²Π½Ρ‹ΠΌΠΈ Π½Π° Ρ‚Π΅Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈ устройствах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для вычСрчивания сСктора эллипса, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 8.5 (Π±):

QPainter painter(this);

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

painter.setPen(QPen(Qt::black, 15, Qt::SolidLine, Qt::RoundCap, Qt::MiterJoin));

painter.setBrush(QBrush(Qt::blue, Qt::DiagCrossPattern));

painter.drawPie(80, 80, 400, 240, 60 * 16, 270 * 16);

Π”Π²Π° послСдних Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ drawPie() Π·Π°Π΄Π°ΡŽΡ‚ΡΡ Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Ρ‹Ρ… долях градуса.

НиТС приводится ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для вычСрчивания ΠΊΡ€ΠΈΠ²ΠΎΠΉ Π‘Π΅Π·ΡŒΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ порядка, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π½Π° рис. 8.5 (Π²):

QPainter painter(this);

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

QPainterPath path;

path.moveTo(80, 320);

path.cubicTo(200, 80, 320, 80, 480, 320);

painter.setPen(QPen(Qt::black, 8));

painter.drawPath(path);

Класс QPainterPath ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ, соСдиняя Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ основныС графичСскиС элСмСнты: прямыС Π»ΠΈΠ½ΠΈΠΈ, эллипсы, ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, Π΄ΡƒΠ³ΠΈ, ΠΊΡ€ΠΈΠ²Ρ‹Π΅ Π‘Π΅Π·ΡŒΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ порядка ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ графичСских элСмСнтов Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° (painter paths). Π’Π°ΠΊΠΈΠ΅ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ элСмСнтарными рисунками Π² Ρ‚ΠΎΠΌ смыслС, Ρ‡Ρ‚ΠΎ любая Ρ„ΠΈΠ³ΡƒΡ€Π° ΠΈΠ»ΠΈ любая комбинация Ρ„ΠΈΠ³ΡƒΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСна Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ графичСских элСмСнтов.

Π¦Π΅ΠΏΠΎΡ‡ΠΊΠ° графичСских элСмСнтов опрСдСляСт ΠΊΠΎΠ½Ρ‚ΡƒΡ€, Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΈΡΡ‚ΡŒΡŽ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, прСдставлСнном Π½Π° рис. 8.5 (Π²), ΠΌΡ‹ Π½Π΅ Π·Π°Π΄Π°Π²Π°Π»ΠΈ ΠΊΠΈΡΡ‚ΡŒ, поэтому нарисован Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½Ρ‚ΡƒΡ€.

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

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

Рис. 8.6. ΠšΠΈΡΡ‚ΠΈ QPainter с Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹ΠΌΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ.

β€’ Π›ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ двумя ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ рядом Β«Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Ρ… ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊΒ» Π½Π° Π»ΠΈΠ½ΠΈΠΈ, ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰Π΅ΠΉ эти Ρ‚ΠΎΡ‡ΠΊΠΈ. НапримСр, Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π° рис. 8.6 создан ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

QLinearGradient gradient(50, 100, 300, 350);

gradient.setColorAt(0.0, Qt::white);

gradient.setColorAt(0.2, Qt::green);

gradient.setColorAt(1.0, Qt::black);

ΠœΡ‹ Π·Π°Π΄Π°Π»ΠΈ Ρ‚Ρ€ΠΈ Ρ†Π²Π΅Ρ‚Π° Π² Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π½Ρ‹Ρ… позициях ΠΌΠ΅ΠΆΠ΄Ρƒ двумя ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ. ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ чисСл с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 1, Π³Π΄Π΅ 0 соотвСтствуСт ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, Π° 1 β€” послСднСй ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅. Π¦Π²Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ этими позициями интСрполируСтся.

β€’ Π Π°Π΄ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (хс, ус), радиусом r ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ фокуса (xf, yf), которая дополняСт Ρ†Π²Π΅Ρ‚ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ радиус ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ. ИзмСнСниС Ρ†Π²Π΅Ρ‚Π° распространяСтся Π²ΠΎ всС стороны ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ фокуса, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ с Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ окруТности.

β€’ ΠšΠΎΠ½ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (хс, ус) ΠΈ ΡƒΠ³Π»ΠΎΠΌ Ξ±. ИзмСнСниС Ρ†Π²Π΅Ρ‚Π° распространяСтся Π²ΠΎΠΊΡ€ΡƒΠ³ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ сСкундной стрСлки часов.

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ настройках ΠΏΠ΅Ρ€Π°, кисти ΠΈ ΡˆΡ€ΠΈΡ„Ρ‚Π° Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ°. QPainter ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠ΅ Π½Π° способ рисования Ρ„ΠΈΠ³ΡƒΡ€ ΠΈ тСкста: