diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index e0d8995bf83..d5ed9ad368f 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1501,6 +1501,14 @@ QList QDockAreaLayoutInfo::indexOf(const QWidget *widget) const return QList(); } +std::unique_ptr QDockAreaLayoutInfo::takeWidgetItem(QWidget *widget) +{ + std::unique_ptr widgetItem; + if (const auto path = indexOf(widget); !path.isEmpty()) + widgetItem.reset(item(path).widgetItem); + return widgetItem; +} + QMainWindowLayout *QDockAreaLayoutInfo::mainWindowLayout() const { QMainWindowLayout *result = qt_mainwindow_layout(mainWindow); diff --git a/src/widgets/widgets/qdockarealayout_p.h b/src/widgets/widgets/qdockarealayout_p.h index ca9f4b656f0..587d7077a5f 100644 --- a/src/widgets/widgets/qdockarealayout_p.h +++ b/src/widgets/widgets/qdockarealayout_p.h @@ -145,6 +145,7 @@ public: QList indexOf(const QWidget *widget) const; QList indexOfPlaceHolder(const QString &objectName) const; + std::unique_ptr takeWidgetItem(QWidget *widget); QDockWidget *apply(bool animate); diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 14a8bbd857d..b81b17a64ba 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -470,6 +470,12 @@ void QDockWidgetGroupWindow::destroyOrHideIfEmpty() if (!wasHidden) dw->show(); } + Q_ASSERT(qobject_cast(parentWidget())); + auto *mainWindow = static_cast(parentWidget()); + QMainWindowLayout *mwLayout = qt_mainwindow_layout(mainWindow); + QDockAreaLayoutInfo &parentInfo = mwLayout->layoutState.dockAreaLayout.docks[layoutInfo()->dockPos]; + std::unique_ptr cleanup = parentInfo.takeWidgetItem(this); + parentInfo.remove(this); deleteLater(); } @@ -713,7 +719,8 @@ void QDockWidgetGroupWindow::destroyIfSingleItemLeft() if (layoutInfo()->indexOf(lastDockWidget).isEmpty()) return; - auto *mainWindow = qobject_cast(parentWidget()); + Q_ASSERT(qobject_cast(parentWidget())); + auto *mainWindow = static_cast(parentWidget()); QMainWindowLayout *mwLayout = qt_mainwindow_layout(mainWindow); // Unplug the last remaining dock widget and hide the group window, to avoid flickering @@ -721,17 +728,12 @@ void QDockWidgetGroupWindow::destroyIfSingleItemLeft() lastDockWidget->setGeometry(geometry()); hide(); - // Get the layout info for the main window dock, where dock widgets need to go - QDockAreaLayoutInfo &parentInfo = mwLayout->layoutState.dockAreaLayout.docks[layoutInfo()->dockPos]; - // Re-parent last dock widget reparentToMainWindow(lastDockWidget); // the group window could still have placeholder items => clear everything layoutInfo()->item_list.clear(); - // remove the group window and the dock's item_list pointing to it. - parentInfo.remove(this); destroyOrHideIfEmpty(); } @@ -741,13 +743,14 @@ void QDockWidgetGroupWindow::reparentToMainWindow(QDockWidget *dockWidget) // - remove it from the floating dock's layout info // - insert it to the main dock's layout info // Finally, set draggingDock to nullptr, since the drag is finished. - auto *mainWindow = qobject_cast(parentWidget()); - Q_ASSERT(mainWindow); + Q_ASSERT(qobject_cast(parentWidget())); + auto *mainWindow = static_cast(parentWidget()); QMainWindowLayout *mwLayout = qt_mainwindow_layout(mainWindow); Q_ASSERT(mwLayout); QDockAreaLayoutInfo &parentInfo = mwLayout->layoutState.dockAreaLayout.docks[layoutInfo()->dockPos]; dockWidget->removeEventFilter(this); parentInfo.add(dockWidget); + std::unique_ptr cleanup = layoutInfo()->takeWidgetItem(dockWidget); layoutInfo()->remove(dockWidget); const bool wasFloating = dockWidget->isFloating(); const bool wasVisible = dockWidget->isVisible();