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

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

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

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

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

β€’ Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° кисти (brush origin) Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΡƒ Π½Π°Ρ‡Π°Π»Π° отобраТСния шаблона кисти, Π² качСствС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°.

β€’ Π“Ρ€Π°Π½ΠΈΡ†Ρ‹ области рисования (clip region) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ рисования устройства. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ рисования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выходят Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ этой области, ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

β€’ ΠžΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния, ΠΎΠΊΠ½ΠΎ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° прСобразования (viewport, window ΠΈ world matfix) ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ способ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° логичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ QPainter Π² физичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ устройства рисования. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ систСмы логичСских ΠΈ физичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚. БистСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

β€’ Π Π΅ΠΆΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (composition mode) опрСдСляСт способ взаимодСйствия Π½ΠΎΠ²Ρ‹Ρ… Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… пиксСлСй с пиксСлями, ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π½Π° устройствС рисования. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌ Β«source overΒ», ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΠΎΠ²Ρ‹Π΅ пиксСли Ρ€ΠΈΡΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…. Π­Ρ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ поддСрТиваСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ устройствами, ΠΈ ΠΎΠ½ рассматриваСтся ΠΏΠΎΠ·ΠΆΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅.

Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² стСкС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ°, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ save(), ΠΈ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ restore(). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли трСбуСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ настройки Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΡ… Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² ΠΏΡ€Π΅ΠΆΠ½ΠΈΠ΅ значСния, ΠΊΠ°ΠΊ ΠΌΡ‹ это ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ°

Π’ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΠΎΠΉ систСмС Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° QPainter Ρ‚ΠΎΡ‡ΠΊΠ° (0, 0) находится Π² Π»Π΅Π²ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΡƒΠ³Π»Ρƒ устройства рисования; Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ x увСличиваСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π²ΠΏΡ€Π°Π²ΠΎ, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Ρƒ увСличиваСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π²Π½ΠΈΠ·. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСль Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ 1 Γ— 1 Π² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΠΎΠΉ систСмС, примСняСмой ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

НСобходимо ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ особСнности: Ρ†Π΅Π½Ρ‚Ρ€ пиксСля ΠΈΠΌΠ΅Π΅Ρ‚ Β«ΠΏΠΎΠ»ΡƒΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Π΅Β» ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹. НапримСр, пиксСль Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ Π»Π΅Π²ΠΎΠΌ ΡƒΠ³Π»Ρƒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ (0, 0) ΠΈ (1, 1), Π° Π΅Π³ΠΎ Ρ†Π΅Π½Ρ‚Ρ€ находится Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (0.5, 0.5). Если ΠΌΡ‹ просим QPainter Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ пиксСль, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (100, 100), Π΅Π³ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ смСщСны Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ +0.5 ΠΏΠΎ ΠΎΠ±ΠΎΠΈΠΌ направлСниям, ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ нарисованный пиксСль Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (100.5, 100.5).

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд эта ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ прСдставляСт лишь тСорСтичСский интСрСс, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²Π°ΠΆΠ½Ρ‹Π΅ практичСскиС послСдствия. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, смСщСниС +0.5 дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ сглаТивания Π»ΠΈΠ½ΠΈΠΉ (Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ); Ссли Ρ€Π΅ΠΆΠΈΠΌ сглаТивания Π»ΠΈΠ½ΠΈΠΉ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΈ ΠΌΡ‹ пытаСмся Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ пиксСль Ρ‡Π΅Ρ€Π½ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π° Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (100, 100), QPainter фактичСски Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ Π½Π° экран Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ свСтло-сСрых пиксСля Π² Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… (99.5, 99.5), (99.5, 100.5), (100.5, 99.5) ΠΈ (100.5, 100.5), Ρ‡Ρ‚ΠΎΠ±Ρ‹ создалось Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»Π΅Π½ΠΈΠ΅ располоТСния пиксСля Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ соприкосновСния всСх этих Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… пиксСлСй. Если этот эффСкт Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»Π΅Π½, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, указывая ΠΏΠΎΠ»ΡƒΠΏΠΈΠΊΡΠ΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (100.5, 100.5).

ΠŸΡ€ΠΈ Π½Π°Ρ‡Π΅Ρ€Ρ‚Π°Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Ρ„ΠΈΠ³ΡƒΡ€, ΠΊΠ°ΠΊ Π»ΠΈΠ½ΠΈΠΈ, ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ ΠΈ эллипсы, Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°. На рис 8.7 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ измСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° drawRect(2, 2, 6, 5) Π² зависимости ΠΎΡ‚ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΏΠ΅Ρ€Π°, ΠΊΠΎΠ³Π΄Π° сглаТиваниС Π»ΠΈΠ½ΠΈΠΉ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ. Π’ частности, Π²Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ 6 Γ— 5, Π²Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠ΅Ρ€ΠΎΠΌ с ΡˆΠΈΡ€ΠΈΠ½ΠΎΠΉ 1, фактичСски Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 7 Γ— 6. Π­Ρ‚ΠΎ Π½Π΅ дСлалось ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ срСдствами, Π² Ρ‚ΠΎΠΌ числС Π² Ρ€Π°Π½Π½ΠΈΡ… вСрсиях Qt, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ сущСствСнСн для получСния Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ, нСзависимой ΠΎΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ способности Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ.

Рис. 8.7. Π’Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° 6 Γ— 5 ΠΏΡ€ΠΈ отсутствии сглаТивания Π»ΠΈΠ½ΠΈΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ознакомились с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π½ΠΎΠΉ систСмой, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π΅Π΅ измСнСния ΠΏΡ€ΠΈ использовании Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠΎΠΌ QPainter области отобраТСния, ΠΎΠΊΠ½Π° ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования. (Π’ Π΄Π°Π½Π½ΠΎΠΌ контСкстС Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΎΠΊΠ½ΠΎΒ» Π½Π΅ являСтся ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΊΠ½Π° Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½ Β«ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния» Π½ΠΈΠΊΠ°ΠΊ Π½e связан с ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ отобраТСния QScrollArea.)

Π’Π΅Ρ€ΠΌΠΈΠ½Ρ‹ Β«ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния» ΠΈ Β«ΠΎΠΊΠ½ΠΎΒ» сильно связаны Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ. ΠžΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния являСтся ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠΌ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π² физичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ…. Окно опрСдСляСт Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π½ΠΎ Π² логичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°Ρ…. ΠŸΡ€ΠΈ рисовании ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡Π΅ΠΊ Π² логичСской систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, ΠΈ эти ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ алгСбраичСского прСобразования пСрСводятся Π² Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π½Π° основС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… настроСк связи Β«ΠΎΠΊΠ½ΠΎβ€”ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния».

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния ΠΈ ΠΎΠΊΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ устройства рисования. НапримСр, Ссли этим устройством являСтся Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 320 Γ— 200, ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния ΠΈ ΠΎΠΊΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ 320 Γ— 200, Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ располагаСтся Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (0, 0). Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС систСмы логичСских ΠΈ физичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚.

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Β«ΠΎΠΊΠ½ΠΎβ€”ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния» ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для создания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅ΠΉ способности устройства рисования. НапримСр, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ логичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ (β€”50, β€”50) Π΄ΠΎ (+50, +50) с (0, 0) Π² сСрСдинС, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

painter.setWindow(-50, -50, 100, 100):

ΠŸΠ°Ρ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (β€”50, β€”50) Π·Π°Π΄Π°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ, Π° ΠΏΠ°Ρ€Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² (100, 100) Π·Π°Π΄Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈ высоту. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ° с логичСскими ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (β€”50, β€”50) Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ соотвСтствуСт Ρ‚ΠΎΡ‡ΠΊΠ΅ с физичСскими ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (0, 0), Π° Ρ‚ΠΎΡ‡ΠΊΠ° с логичСскими ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (+50, +50) соотвСтствуСт Ρ‚ΠΎΡ‡ΠΊΠ΅ с физичСскими ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ (320, 200). Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π½Π΅ измСняли ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния.

Рис. 8.8. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ логичСских ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π² физичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ дошла Π΄ΠΎ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования. Π­Ρ‚Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ Β«ΠΎΠΊΠ½ΠΎβ€”ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния». Она позволяСт Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±, ΠΏΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ графичСскиС элСмСнты. НапримСр, Ссли Π±Ρ‹ Π½Π°ΠΌ понадобилось ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ тСкст ΠΏΠΎΠ΄ ΡƒΠ³Π»ΠΎΠΌ 45Β°, ΠΌΡ‹ Π±Ρ‹ использовали Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:

QMatrix matrix;

matrix.rotate(45.0);

painter.setMatrix(matrix);

painter.drawText(rect, Qt::AlignCenter, tr("Revenue"));

ЛогичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ drawText(), ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ Π·Π°Ρ‚Π΅ΠΌ пСрСводятся Π² физичСскиС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ связь Β«ΠΎΠΊΠ½ΠΎβ€”ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния».

Если ΠΌΡ‹ Π·Π°Π΄Π°Π΅ΠΌ нСсколько ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, ΠΎΠ½ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ΡΡ Π² порядкС поступлСния. НапримСр, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ (10, 20) Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ пСрСнСсти Π½Π°Ρ‡Π°Π»ΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΎΠΊΠ½Π°, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ пСрСнос Π½Π°Ρ‡Π°Π»Π° ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΎΠΊΠ½Π°, устанавливая Π΅Π³ΠΎ Π² ΠΏΡ€Π΅ΠΆΠ½Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

QMatrix matrix;

matrix.translate(-10.0, -20.0);

matrix.rotate(45.0);

matrix.translate(+10.0, +20.0);

painter.setMatrix(matrix);

painter.drawText(rect, Qt::AlignCenter, tr("Revenue"));

Π‘ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ прСобразования ΠΏΡƒΡ‚Π΅ΠΌ примСнСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ класса QPainter β€” translate(), scale(), rotate() ΠΈ shear():

painter.translate(-10.0, -20.0);

painter.rotate(45.0);

painter.translate(+10.0, +20.0);

painter.drawText(rect, Qt::AlignCenter, tr("Revenue"));

Но Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ рСгулярно Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ прСобразования, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ эффСктивно ΠΏΡ€ΠΈ ΠΈΡ… Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ QMatrix ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ прСобразования для Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅.

Рис. 8.9. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ OvenTimer.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ прСобразования Ρ€ΠΈΡΠΎΠ²Π°Π»ΡŒΡ‰ΠΈΠΊΠ° ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° OvenTimer (Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π΄ΡƒΡ…ΠΎΠ²ΠΊΠΈ), ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° рис. 8.9. Π’ΠΈΠ΄ΠΆΠ΅Ρ‚ OvenTimer ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΡƒΡ…ΠΎΠ½Π½Ρ‹Π΅ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ использовались Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π² Π΄ΡƒΡ…ΠΎΠ²ΠΊΠ°Ρ… стали ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ встроСнныС часы. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΡƒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Диск ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ автоматичСски поворачиваСтся ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ 0, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ OvenTimer Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал timeout().

01 class OvenTimer : public QWidget