Use old position to set window position after recreation
Like window state and visibility, the window position should also remain the same after the window is recreated. Fixes: QTBUG-128790 Change-Id: Iad8599da7ef83eff6a93f7f071e6b452491a0d87 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
parent
9261b68395
commit
d4ccceabf4
@ -10908,10 +10908,12 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
|
|||||||
<< "to support" << surfaceType;
|
<< "to support" << surfaceType;
|
||||||
const auto windowStateBeforeDestroy = newParentWithWindow->windowState();
|
const auto windowStateBeforeDestroy = newParentWithWindow->windowState();
|
||||||
const auto visibilityBeforeDestroy = newParentWithWindow->isVisible();
|
const auto visibilityBeforeDestroy = newParentWithWindow->isVisible();
|
||||||
|
const auto positionBeforeDestroy = newParentWithWindow->pos();
|
||||||
newParentWithWindow->destroy();
|
newParentWithWindow->destroy();
|
||||||
newParentWithWindow->create();
|
newParentWithWindow->create();
|
||||||
Q_ASSERT(newParentWithWindow->windowHandle());
|
Q_ASSERT(newParentWithWindow->windowHandle());
|
||||||
newParentWithWindow->windowHandle()->setWindowStates(windowStateBeforeDestroy);
|
newParentWithWindow->windowHandle()->setWindowStates(windowStateBeforeDestroy);
|
||||||
|
newParentWithWindow->move(positionBeforeDestroy);
|
||||||
QWidgetPrivate::get(newParentWithWindow)->setVisible(visibilityBeforeDestroy);
|
QWidgetPrivate::get(newParentWithWindow)->setVisible(visibilityBeforeDestroy);
|
||||||
} else if (auto *backingStore = newParentWithWindow->backingStore()) {
|
} else if (auto *backingStore = newParentWithWindow->backingStore()) {
|
||||||
// If we don't recreate we still need to make sure the native parent
|
// If we don't recreate we still need to make sure the native parent
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <QScrollArea>
|
#include <QScrollArea>
|
||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include <QMainWindow>
|
||||||
|
|
||||||
#include <private/qhighdpiscaling_p.h>
|
#include <private/qhighdpiscaling_p.h>
|
||||||
#include <private/qwidget_p.h>
|
#include <private/qwidget_p.h>
|
||||||
@ -261,6 +262,7 @@ private slots:
|
|||||||
void scroll();
|
void scroll();
|
||||||
void paintOnScreenUpdates();
|
void paintOnScreenUpdates();
|
||||||
void evaluateRhi();
|
void evaluateRhi();
|
||||||
|
void rhiRecreateMaintainsWindowProperties();
|
||||||
|
|
||||||
#if defined(QT_BUILD_INTERNAL)
|
#if defined(QT_BUILD_INTERNAL)
|
||||||
void scrollWithOverlap();
|
void scrollWithOverlap();
|
||||||
@ -798,6 +800,29 @@ void tst_QWidgetRepaintManager::evaluateRhi()
|
|||||||
#endif // QT_CONFIG(opengl)
|
#endif // QT_CONFIG(opengl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QWidgetRepaintManager::rhiRecreateMaintainsWindowProperties()
|
||||||
|
{
|
||||||
|
const auto *integration = QGuiApplicationPrivate::platformIntegration();
|
||||||
|
if (!integration->hasCapability(QPlatformIntegration::RhiBasedRendering))
|
||||||
|
QSKIP("Platform does not support RHI based rendering");
|
||||||
|
|
||||||
|
#if !QT_CONFIG(opengl)
|
||||||
|
QSKIP("Platform does not support OpenGL RHI based rendering");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Reparenting Rhi widget into a window causes the window to be
|
||||||
|
// recreated, but after recreation the window properties such as
|
||||||
|
// window position must remain the same
|
||||||
|
QMainWindow topLevel;
|
||||||
|
topLevel.show();
|
||||||
|
QVERIFY(QTest::qWaitForWindowExposed(&topLevel));
|
||||||
|
QPoint windowPos = topLevel.pos();
|
||||||
|
RhiWidget nativeRhiWidget(QPlatformBackingStoreRhiConfig::OpenGL, &topLevel);
|
||||||
|
QVERIFY(QWidgetPrivate::get(&topLevel)->usesRhiFlush);
|
||||||
|
QVERIFY(QWidgetPrivate::get(&topLevel)->rhi());
|
||||||
|
QCOMPARE(topLevel.pos(), windowPos);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(QT_BUILD_INTERNAL)
|
#if defined(QT_BUILD_INTERNAL)
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user