Enable QComboBox animation on Windows and fixing related bugs
authorThomas Hartmann <Thomas.Hartmann@nokia.com>
Fri, 17 Aug 2012 09:10:15 +0000 (11:10 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 20 Aug 2012 13:52:51 +0000 (15:52 +0200)
QWidget:grab() has a default parameter (invalid rect).
QRect() is the null rect and widget->grab(QRect())
returns an empty pixmap.

QWidget:grab() has to be free of side effects and should not
affect any dirty flags.

Change-Id: I8ff558343c366769cd6c587e77f862668e8054f2
Task-number: QTBUG-25436
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@nokia.com>
src/widgets/kernel/qwidget.cpp
src/widgets/widgets/qcombobox.cpp
src/widgets/widgets/qeffects.cpp

index d41e80f..c2b78e8 100644 (file)
@@ -4757,6 +4757,7 @@ QPixmap QWidget::grab(const QRect &rectangle)
 
     const QWidget::RenderFlags renderFlags = QWidget::DrawWindowBackground | QWidget::DrawChildren | QWidget::IgnoreMask;
 
+    const bool oldDirtyOpaqueChildren =  d->dirtyOpaqueChildren;
     QRect r(rectangle);
     if (r.width() < 0 || r.height() < 0) {
         // For grabbing widgets that haven't been shown yet,
@@ -4772,6 +4773,8 @@ QPixmap QWidget::grab(const QRect &rectangle)
     if (!d->isOpaque)
         res.fill(Qt::transparent);
     render(&res, QPoint(), QRegion(r), renderFlags);
+
+    d->dirtyOpaqueChildren = oldDirtyOpaqueChildren;
     return res;
 }
 
index 916ec2f..82e005e 100644 (file)
@@ -2470,7 +2470,7 @@ void QComboBox::showPopup()
     const bool updatesEnabled = container->updatesEnabled();
 #endif
 
-#if defined(Q_WS_WIN) && !defined(QT_NO_EFFECTS)
+#if !defined(QT_NO_EFFECTS)
     bool scrollDown = (listRect.topLeft() == below);
     if (QApplication::isEffectEnabled(Qt::UI_AnimateCombo)
         && !style->styleHint(QStyle::SH_ComboBox_Popup, &opt, this) && !window()->testAttribute(Qt::WA_DontShowOnScreen))
index 452f04e..c6e7154 100644 (file)
@@ -162,7 +162,7 @@ void QAlphaWidget::run(int time)
     move(widget->geometry().x(),widget->geometry().y());
     resize(widget->size().width(), widget->size().height());
 
-    frontImage = widget->grab(QRect()).toImage();
+    frontImage = widget->grab().toImage();
     backImage = QGuiApplication::primaryScreen()->grabWindow(QApplication::desktop()->winId(),
                                 widget->geometry().x(), widget->geometry().y(),
                                 widget->geometry().width(), widget->geometry().height()).toImage();