diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index eb6f1d83c1..cf9c1d565c 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -1013,12 +1013,18 @@ bool QDockWidgetPrivate::mouseMoveEvent(QMouseEvent *event) pos = event->globalPosition().toPoint() - state->pressPos - windowMarginOffset; } + // If the newly floating dock widget has got a native title bar, + // offset the position by the native title bar's height or width + const int dx = q->geometry().x() - q->x(); + const int dy = q->geometry().y() - q->y(); + pos.rx() += dx; + pos.ry() += dy; + QDockWidgetGroupWindow *floatingTab = qobject_cast(parent); if (floatingTab && !q->isFloating()) floatingTab->move(pos); else q->move(pos); - if (state && !state->ctrlDrag) mwlayout->hover(state->widgetItem, event->globalPosition().toPoint()); diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index d5ea3d6e24..dc90731c68 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -2655,8 +2655,21 @@ QLayoutItem *QMainWindowLayout::unplug(QWidget *widget, bool group) #endif // QT_CONFIG(tabwidget) { // Dock widget is unplugged from the main window - // => geometry is not supposed to change - dw->d_func()->unplug(QRect()); + // => geometry needs to be adjusted by separator size + switch (dockWidgetArea(dw)) { + case Qt::LeftDockWidgetArea: + case Qt::RightDockWidgetArea: + r.adjust(0, 0, 0, -sep); + break; + case Qt::TopDockWidgetArea: + case Qt::BottomDockWidgetArea: + r.adjust(0, 0, -sep, 0); + break; + case Qt::NoDockWidgetArea: + case Qt::DockWidgetArea_Mask: + break; + } + dw->d_func()->unplug(r); } } #endif // QT_CONFIG(dockwidget)