fix QWidget::grab(QRect(x, y, -1, -1))
authorJoerg Bornemann <joerg.bornemann@nokia.com>
Mon, 2 Jul 2012 15:08:43 +0000 (17:08 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 3 Jul 2012 11:32:01 +0000 (13:32 +0200)
Grabbing a widget with a position != (0,0) and an invalid size returned
a pixmap of the widget's size. As we're grabbing just a part of the
widget, the pixmap must be smaller by the amount of x, respective y.

Autotest: tst_QWidget::grab()

Change-Id: I3d5103e6e7c042cc6112038ace236e3f69060bda
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
src/widgets/kernel/qwidget.cpp

index 0da2841..2fcf3e4 100644 (file)
@@ -4763,8 +4763,12 @@ QPixmap QWidget::grab(const QRect &rectangle)
     const QWidget::RenderFlags renderFlags = QWidget::DrawWindowBackground | QWidget::DrawChildren | QWidget::IgnoreMask;
 
     QRect r(rectangle);
-    if (r.width() < 0 || r.height() < 0)
+    if (r.width() < 0 || r.height() < 0) {
+        // For grabbing widgets that haven't been shown yet,
+        // we trigger the layouting mechanism to determine the widget's size.
         r = d->prepareToRender(QRegion(), renderFlags).boundingRect();
+        r.setTopLeft(rectangle.topLeft());
+    }
 
     if (!r.intersects(rect()))
         return QPixmap();