@@ -45,10 +45,11 @@ ScalableImageLabel::ScalableImageLabel(QScrollArea* parent) : QLabel(parent), pa
45
45
void ScalableImageLabel::setImage (const QImage& image)
46
46
{
47
47
fullSizePixmap = QPixmap::fromImage (image);
48
+ imageLoaded = true ;
49
+ setPixmap (fullSizePixmap);
48
50
fillMode = true ;
49
51
setBarsEnabled (false );
50
- setPixmap (fullSizePixmap);
51
- imageLoaded = true ;
52
+ imageCenter = QPoint ();
52
53
setHandCursor (true );
53
54
}
54
55
@@ -60,6 +61,7 @@ void ScalableImageLabel::clearImage()
60
61
fullSizePixmap = QPixmap ();
61
62
setPixmap (QPixmap ());
62
63
imageLoaded = false ;
64
+ imageCenter = QPoint ();
63
65
setNormalCursor ();
64
66
}
65
67
@@ -135,6 +137,12 @@ void ScalableImageLabel::wheelEvent(QWheelEvent* event)
135
137
int newMaxScrollY = newImageHeight - availableArea.height ();
136
138
setMaxScroll (newMaxScrollX, newMaxScrollY);
137
139
setScroll (newScrollX, newScrollY);
140
+
141
+ // Calculate and save new center position
142
+ saveNewImageCenter ();
143
+ }
144
+ else {
145
+ imageCenter = QPoint ();
138
146
}
139
147
140
148
event->accept ();
@@ -156,7 +164,7 @@ void ScalableImageLabel::paintEvent(QPaintEvent* event)
156
164
if (!imageLoaded) return ;
157
165
QSize availableArea = parent->maximumViewportSize ();
158
166
bool resize = false ;
159
-
167
+
160
168
// Resize if max-zoomed image is smaller than the available area
161
169
resize |= MAX_ZOOM_RATIO * fullSizePixmap.width () < availableArea.width () && MAX_ZOOM_RATIO * fullSizePixmap.height () < availableArea.height ();
162
170
// Resize if fill mode is active but the image is bigger than the available area
@@ -172,6 +180,13 @@ void ScalableImageLabel::paintEvent(QPaintEvent* event)
172
180
}
173
181
}
174
182
183
+ if (!fillMode) {
184
+ // Make sure image stays centered
185
+ int moveX = getScrollX () + availableArea.width () / 2 - imageCenter.x ();
186
+ int moveY = getScrollY () + availableArea.height () / 2 - imageCenter.y ();
187
+ if (moveX || moveY) scrollRelative (QPoint (moveX, moveY));
188
+ }
189
+
175
190
QLabel::paintEvent (event);
176
191
}
177
192
@@ -207,6 +222,7 @@ void ScalableImageLabel::mouseMoveEvent(QMouseEvent* event)
207
222
if (!imageLoaded || fillMode || mousePressedAt.isNull ()) return ;
208
223
QPoint mouseMove = event->globalPosition ().toPoint () - mousePressedAt;
209
224
scrollRelative (mouseMove);
225
+ saveNewImageCenter ();
210
226
mousePressedAt = event->globalPosition ().toPoint ();
211
227
}
212
228
@@ -229,6 +245,15 @@ void ScalableImageLabel::mouseReleaseEvent(QMouseEvent* event)
229
245
230
246
231
247
248
+ void ScalableImageLabel::saveNewImageCenter ()
249
+ {
250
+ QSize availableArea = parent->maximumViewportSize ();
251
+ int centerX = getScrollX () + availableArea.width () / 2 ;
252
+ int centerY = getScrollY () + availableArea.height () / 2 ;
253
+ imageCenter = QPoint (centerX, centerY);
254
+ }
255
+
256
+
232
257
/* *
233
258
* Sets the enabled status of the parent QScrollArea's scroll bars.
234
259
*
0 commit comments