ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ 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, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΡΠ½ΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ»ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.