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

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

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

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ rubberBandRect ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ QRect. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ QRect ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π»ΠΈΠ±ΠΎ Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (x, Ρƒ, w, h), Π³Π΄Π΅ (x, Ρƒ) являСтся ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π° ΠΈ w Γ— h опрСдСляСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π»ΠΈΠ±ΠΎ ΠΏΠ°Ρ€ΠΎΠΉ Ρ‚ΠΎΡ‡Π΅ΠΊ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»ΠΎΠ². Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ с ΠΏΠ°Ρ€ΠΎΠΉ Ρ‚ΠΎΡ‡Π΅ΠΊ. Π’ΠΎ мСсто, Π³Π΄Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ» ΠΌΡ‹ΡˆΠΊΠΎΠΉ, становится Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ Π»Π΅Π²Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ, Π° тСкущая позиция курсора опрСдСляСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ updateRubberBandRegion() для ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ пСрСрисовки (нСбольшой) области, ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚ΠΎΠΉ.

Π’ Qt прСдусмотрСно Π΄Π²Π° способа управлСния Ρ„ΠΎΡ€ΠΌΠΎΠΉ курсора ΠΌΡ‹ΡˆΠΊΠΈ:

β€’ QWidget::setCursor() устанавливаСт Ρ„ΠΎΡ€ΠΌΡƒ курсора, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ Π΅Π³ΠΎ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅. Если для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° курсор Π½Π΅ Π·Π°Π΄Π°Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ курсор Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня назначаСтся курсор Π² Π²ΠΈΠ΄Π΅ стрСлки;

β€’ QApplication::setOverrideCursor() устанавливаСт Ρ„ΠΎΡ€ΠΌΡƒ курсора для всСго прилоТСния, отмСняя Ρ„ΠΎΡ€ΠΌΡ‹ курсоров ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ restoreOverrideCursor().

Π’ Π³Π»Π°Π²Π΅ 4 ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QApplication::setOverrideCursor() с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Qt::WaitCursor для установки курсора прилоТСния Π½Π° стандартный курсор оТидания.

107 void Plotter::mouseMoveEvent(QMouseEvent *event)

108 {

109 if (rubberBandIsShown) {

110 updateRubberBandRegion();

111 rubberBandRect.setBottomRight(event->pos());

112 updateRubberBandRegion();

113 }

114 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ курсор ΠΌΡ‹ΡˆΠΊΠΈ с Π½Π°ΠΆΠ°Ρ‚ΠΎΠΉ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ, ΠΌΡ‹ сначала Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ updateRubberBandRegion() для постановки Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ события рисования для пСрСрисовки области, занятой Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚ΠΎΠΉ, Π·Π°Ρ‚Π΅ΠΌ пСрСсчитываСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ rubberBandRect для ΡƒΡ‡Π΅Ρ‚Π° пСрСмСщСния курсора ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π· Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ updateRubberBandRegion() для пСрСрисовки области, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠ»Π°ΡΡŒ рСзиновая Π»Π΅Π½Ρ‚Π°. Π­Ρ‚ΠΎ фактичСски ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΡ‚ΠΈΡ€Π°Π½ΠΈΡŽ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ ΠΈ Π΅Π΅ Π²Ρ‹Ρ‡Π΅Ρ€Ρ‡ΠΈΠ²Π°Π½ΠΈΡŽ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ.

Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΌΡ‹ΡˆΠΊΡƒ Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π»Π΅Π²ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ rubberBandRect Π²Ρ‹ΡˆΠ΅ ΠΈΠ»ΠΈ Π»Π΅Π²Π΅Π΅ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»Π°. Π’ этом случаС QRect Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈΠ»ΠΈ высоту. Π’ paintEvent() Π½Π°ΠΌΠΈ использована функция QRect::normalized(), которая настраиваСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΡƒΠ³Π»ΠΎΠ² для получСния ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ высоты.

115 void Plotter::mouseReleaseEvent(QMouseEvent *event)

116 {

117 if ((event->button() == Qt::LeftButton) &&

118 rubberBandIsShown) {

119 rubberBandIsShown = false;

120 updateRubberBandRegion();

121 unsetCursor();


122 QRect rect = rubberBandRect.normalized();

123 if (rect.width() < 4 || rect.height() < 4)

124 return;

125 rect.translate(-Margin, -Margin);


126 PlotSettings prevSettings = zoomStack[curZoom];

127 PlotSettings settings;

128 double dx = prevSettings.spanX() / (width() - 2 * Margin);

130 double dy = prevSettings.spanY() / (height() - 2 * Margin);


131 settings.minX = prevSettings.minX + dx * rect.left();

132 settings.maxX = prevSettings.minX + dx * rect.right();

133 settings.minY = prevSettings.maxY - dy * rect.bottom();

134 settings.maxY = prevSettings.maxY - dy * rect.top();

135 settings.adjust();


136 zoomStack.resize(curZoom + 1);

137 zoomStack.append(settings);

138 zoomIn();

139 }

140 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ отпускаСт Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ΡˆΠΊΠΈ, ΠΌΡ‹ стираСм Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΡƒΡŽ Π»Π΅Π½Ρ‚Ρƒ ΠΈ восстанавливаСм стандартный курсор Π² Π²ΠΈΠ΄Π΅ стрСлки. Если рСзиновая Π»Π΅Π½Ρ‚Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 4 Γ— 4, ΠΌΡ‹ измСняСм ΠΌΠ°ΡΡˆΡ‚Π°Π± изобраТСния. Если рСзиновая Π»Π΅Π½Ρ‚Π° выдСляСт ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ сдСлал Ρ‰Π΅Π»Ρ‡ΠΎΠΊ ΠΌΡ‹ΡˆΠΊΠΎΠΉ ΠΏΠΎ ошибкС ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅Π²Π΅Π» фокус, ΠΈ поэтому ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎ измСнСнию ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° изобраТСния Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ слоТСн. Π­Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ сразу с двумя систСмами ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚: Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° ΠΈ построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ². Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ выполняСмых здСсь дСйствий связано с ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° rubberBandRect (ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹) ΠΈΠ· систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ². ПослС выполнСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ PlotSettings::adjust() для округлСния чисСл ΠΈ опрСдСлСния Ρ€Π°Π·ΡƒΠΌΠ½ΠΎΠ³ΠΎ количСства ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΏΠΎ ΠΎΠ±Π΅ΠΈΠΌ осям. Π­Ρ‚Π° ситуация ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½Π° Π½Π° рис. 5.10 ΠΈ 5.11.

Рис. 5.10. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ ΠΈΠ· систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π° Π² систСму ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ².

Рис. 5.11. Настройка ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ Π² систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ построитСля Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ изобраТСния.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ измСняСм ΠΌΠ°ΡΡˆΡ‚Π°Π± изобраТСния. Π­Ρ‚ΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ помСщСния Π½ΠΎΠ²Ρ‹Ρ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ рассчитанных настроСк PlotSettings Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² изобраТСния ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ zoomIn(), которая выполняСт всю ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

141 void Plotter::keyPressEvent(QKeyEvent *event)

142 {

143 switch (event->key()) {

144 case Qt::Key_Plus:

145 zoomIn();

146 break;

147 case Qt::Key_Minus:

148 zoomOut();

149 break;

150 case Qt::Key_Left:

151 zoomStack[curZoom].scroll(-1, 0);

152 refreshPixmap();

153 break;

154 case Qt::Key_Right:

155 zoomStack[сurZoom].scrol1(+1, 0);

156 refreshPixmap();

157 break;

158 case Qt::Key_Down:

159 zoomStack[curZoom].scroll(0, -1);

160 refreshPixmap();

161 break;

162 case Qt::Key_Up:

163 zoomStack[curZoom].scroll(0, +1);

164 refreshPixmap();

165 break;

166 default:

167 QWidget::keyPressEvent(event);

168 }

169 }

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ ΠΈ фокус ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² Plotter, вызываСтся функция keyPressEvent(). ΠœΡ‹ Π΅Π΅ пСрСопрСдСляСм здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»Π° Π½Π° ΡˆΠ΅ΡΡ‚ΡŒ клавиш: +, β€”, Up (Π²Π²Π΅Ρ€Ρ…), Down (Π²Π½ΠΈΠ·), Left (Π²Π»Π΅Π²ΠΎ) ΠΈ Right (Π²ΠΏΡ€Π°Π²ΠΎ). Если ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса. Для простоты ΠΌΡ‹ Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Shift, Ctrl ΠΈ Alt, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ QKeyEvent::modifiers().

170 void Plotter::wheelEvent(QWheelEvent *event)

171 {

172 int numDegrees= event->delta() / 8;

173 int numTicks = numDegrees / 15;

174 if (event->orientation() == Qt::Horizontal) {

175 zoomStack[curZoom].scroll(numTicks, 0);

176 } else {

177 zoomStack[curZoom].scroll(0, numTicks);

178 }

179 refreshPixmap();

180 }

Бобытия колСсика ΠΌΡ‹ΡˆΠΊΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π΅ колСсика ΠΌΡ‹ΡˆΠΊΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΌΡ‹ΡˆΠ΅ΠΊ прСдусматриваСтся колСсико для пСрСмСщСния ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ΡˆΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ колСсико для пСрСмСщСния ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ. Qt ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ±Π° Π²ΠΈΠ΄Π° колСсиков. Бобытия колСсика ΠΌΡ‹ΡˆΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится фокус. Ѐункция delta() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ колСсика, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ΅ Π² Π²ΠΎΡΡŒΠΌΡ‹Ρ… долях градуса. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ шаг Ρ€Π°Π±ΠΎΡ‚Ρ‹ колСсика ΠΌΡ‹ΡˆΠΊΠΈ составляСт 15 градусов. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ пСрСмСщаСмся Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΎΠΊ, модифицируя Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт стСка ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΎΠ² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈ обновляСм ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ refreshPixmap().

НаиболСС распространСнноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ колСсико ΠΌΡ‹ΡˆΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎ для продвиТСния ΠΏΠΎ полосС ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ. ΠŸΡ€ΠΈ использовании Π½Π°ΠΌΠΈ QScrollArea (рассматриваСтся Π² Π³Π»Π°Π²Π΅ 6) с полосами ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠΈ QScrollArea автоматичСски управляСт событиями колСсика ΠΌΡ‹ΡˆΠΊΠΈ ΠΈ Π½Π°ΠΌ Π½Π΅ приходится самим ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ wheelEvent().

Π­Ρ‚ΠΈΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ рСализация ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² событий. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

181 void Plotter::updateRubberBandRegion()

182 {

183 QRect rect = rubberBandRect.normalized();

184 update(rect.left(), rect.top(), rect.width(), 1);

185 update(rect.left(), rect.top(), 1, rect.height());

186 update(rect.left(), rect.bottom(), rect.width(), 1);

187 update(rect.right(), rect.top(), 1, rect.height());

188 }

Ѐункция updateRubberBand() вызываСтся ΠΈΠ· mousePressEvent(), mouseMoveEvent() ΠΈ mouseReleaseEvent() для стирания ΠΈΠ»ΠΈ пСрСрисовки Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹. Она состоит ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ update(), которая устанавливаСт Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событиС рисования для Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Ρ… областСй, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ (Π΄Π²Π΅ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ Π΄Π²Π΅ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΠ½ΠΈΠΈ). Для рисования Ρ€Π΅Π·ΠΈΠ½ΠΎΠ²ΠΎΠΉ Π»Π΅Π½Ρ‚Ρ‹ Π² Qt прСдусмотрСн класс QRubberBand, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² нашСм случаС Ρ€ΡƒΡ‡Π½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ обСспСчило Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠ΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.