diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2012-12-12 17:16:54 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-12 21:55:57 +0100 |
commit | 76ce3e6419f9b816359c0995ac7f1828e9291d7e (patch) | |
tree | a6125a3cb6d57289bcbb842fb4ef0e25f460a21e | |
parent | bf178c77dda1db56ae698c1d31a6e3f685f4830f (diff) | |
download | qtbase-76ce3e6419f9b816359c0995ac7f1828e9291d7e.tar.gz |
Fix QWidget::setWindowOpacity() when called before show().
Pass opacity from the QWidget to QWindow and to the platform
windows.
Task-number: QTBUG-28477
Change-Id: If5a85d9183bd1ca33dac2052936ecd1e6c0b5f6c
Reviewed-by: Samuel Rødal <samuel.rodal@digia.com>
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 6 | ||||
-rw-r--r-- | src/gui/kernel/qwindow_p.h | 2 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoawindow.mm | 5 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 3 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 4 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 3 |
6 files changed, 19 insertions, 4 deletions
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 68687577b3..b6d592e050 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -654,9 +654,11 @@ void QWindow::lower() void QWindow::setOpacity(qreal level) { Q_D(QWindow); - if (d->platformWindow) { + if (level == d->opacity) // #fixme: Add property for 5.1 + return; + d->opacity = level; + if (d->platformWindow) d->platformWindow->setOpacity(level); - } } /*! diff --git a/src/gui/kernel/qwindow_p.h b/src/gui/kernel/qwindow_p.h index 93179d99b6..305888d02c 100644 --- a/src/gui/kernel/qwindow_p.h +++ b/src/gui/kernel/qwindow_p.h @@ -89,6 +89,7 @@ public: , receivedExpose(false) , positionPolicy(WindowFrameExclusive) , contentOrientation(Qt::PrimaryOrientation) + , opacity(qreal(1.0)) , minimumSize(0, 0) , maximumSize(QWINDOWSIZE_MAX, QWINDOWSIZE_MAX) , modality(Qt::NonModal) @@ -135,6 +136,7 @@ public: bool receivedExpose; PositionPolicy positionPolicy; Qt::ScreenOrientation contentOrientation; + qreal opacity; QSize minimumSize; QSize maximumSize; diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index ffee8528f0..b545844a24 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -49,6 +49,7 @@ #include <QtCore/qfileinfo.h> #include <QtCore/private/qcore_mac_p.h> #include <qwindow.h> +#include <private/qwindow_p.h> #include <qpa/qwindowsysteminterface.h> #include <qpa/qplatformscreen.h> @@ -649,6 +650,10 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow) NSRect frame = NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height()); [m_contentView setFrame:frame]; } + + const qreal opacity = qt_window_private(window())->opacity; + if (!qFuzzyCompare(opacity, qreal(1.0))) + setOpacity(opacity); } NSWindow * QCocoaWindow::createNSWindow() diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 1f6253438f..2f2588bc4a 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -731,6 +731,9 @@ QWindowsWindow::QWindowsWindow(QWindow *aWindow, const WindowData &data) : if (QWindowsContext::instance()->systemInfo() & QWindowsContext::SI_SupportsTouch) QWindowsContext::user32dll.registerTouchWindow(m_data.hwnd, 0); setWindowState(aWindow->windowState()); + const qreal opacity = qt_window_private(aWindow)->opacity; + if (!qFuzzyCompare(opacity, qreal(1.0))) + setOpacity(opacity); } QWindowsWindow::~QWindowsWindow() diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 0db4176607..23e59f0735 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -385,6 +385,10 @@ void QXcbWindow::create() #ifndef QT_NO_DRAGANDDROP connection()->drag()->dndEnable(this, true); #endif + + const qreal opacity = qt_window_private(window())->opacity; + if (!qFuzzyCompare(opacity, qreal(1.0))) + setOpacity(opacity); } QXcbWindow::~QXcbWindow() diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 232524bbb2..ab7330594f 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -10266,6 +10266,7 @@ void QWidget::setWindowOpacity(qreal opacity) QTLWExtra *extra = d->topData(); extra->opacity = uint(opacity * 255); setAttribute(Qt::WA_WState_WindowOpacitySet); + d->setWindowOpacity_sys(opacity); if (!testAttribute(Qt::WA_WState_Created)) return; @@ -10280,8 +10281,6 @@ void QWidget::setWindowOpacity(qreal opacity) return; } #endif - - d->setWindowOpacity_sys(opacity); } /*! |