summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/widgets/qdockarealayout.cpp8
-rw-r--r--tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp26
2 files changed, 28 insertions, 6 deletions
diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp
index 8c79425e44..df26db57ae 100644
--- a/src/widgets/widgets/qdockarealayout.cpp
+++ b/src/widgets/widgets/qdockarealayout.cpp
@@ -1944,12 +1944,8 @@ bool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList<QDockWidget*>
qt_mac_set_drawer_preferred_edge(widget, toDockWidgetArea(dockPos));
} else
#endif
- if (!testing) {
- QRect r(x, y, w, h);
- r = QDockAreaLayout::constrainedRect(r, widget);
- widget->move(r.topLeft());
- widget->resize(r.size());
- }
+ if (!testing)
+ widget->setGeometry(QDockAreaLayout::constrainedRect(QRect(x, y, w, h), widget));
if (!testing) {
widget->setVisible(flags & StateFlagVisible);
diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
index 713dc6b9b8..61a9461a62 100644
--- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
+++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp
@@ -75,6 +75,7 @@ private slots:
void titleBarDoubleClick();
void restoreStateOfFloating();
void restoreDockWidget();
+ void restoreStateWhileStillFloating();
// task specific tests:
void task165177_deleteFocusWidget();
void task169808_setFloating();
@@ -757,6 +758,31 @@ void tst_QDockWidget::restoreStateOfFloating()
QVERIFY(!dock->isFloating());
}
+void tst_QDockWidget::restoreStateWhileStillFloating()
+{
+ // When the dock widget is already floating then it takes a different code path
+ // so this test covers the case where the restoreState() is effectively just
+ // moving it back and resizing it
+ const QRect availGeom = QApplication::desktop()->availableGeometry();
+ const QPoint startingDockPos = availGeom.center();
+ QMainWindow mw;
+ QDockWidget *dock = createTestDock(mw);
+ mw.addDockWidget(Qt::TopDockWidgetArea, dock);
+ dock->setFloating(true);
+ dock->move(startingDockPos);
+ mw.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&mw));
+ QVERIFY(dock->isFloating());
+ QByteArray ba = mw.saveState();
+ const QPoint dockPos = dock->pos();
+ dock->move(availGeom.topLeft() + QPoint(10, 10));
+ dock->resize(dock->size() + QSize(10, 10));
+ QVERIFY(mw.restoreState(ba));
+ QVERIFY(dock->isFloating());
+ if (!QGuiApplication::platformName().compare("xcb", Qt::CaseInsensitive))
+ QTRY_COMPARE(dock->pos(), dockPos);
+}
+
void tst_QDockWidget::restoreDockWidget()
{
QByteArray geometry;