From a03e815b6cf363cd6a2d82e36f0d90bcbd19972c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 17 Aug 2012 11:10:15 +0200 Subject: [PATCH] Enable QComboBox animation on Windows and fixing related bugs 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 Reviewed-by: Friedemann Kleint Reviewed-by: Joerg Bornemann --- src/widgets/kernel/qwidget.cpp | 3 +++ src/widgets/widgets/qcombobox.cpp | 2 +- src/widgets/widgets/qeffects.cpp | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index d41e80fad00..c2b78e86030 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -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; } diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index 916ec2ff09e..82e005ec79b 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -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)) diff --git a/src/widgets/widgets/qeffects.cpp b/src/widgets/widgets/qeffects.cpp index 452f04ea6b1..c6e71542382 100644 --- a/src/widgets/widgets/qeffects.cpp +++ b/src/widgets/widgets/qeffects.cpp @@ -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();