diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index 32d0f9b345a..961530dec9d 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1501,6 +1501,14 @@ QList QDockAreaLayoutInfo::indexOf(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 aa39bf9913c..7ebe3a294f5 100644 --- a/src/widgets/widgets/qdockarealayout_p.h +++ b/src/widgets/widgets/qdockarealayout_p.h @@ -145,6 +145,7 @@ public: QList indexOf(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 22ee3dbc5e4..627a9a3abdf 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -471,6 +471,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(); } @@ -714,7 +720,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 @@ -722,17 +729,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(); } @@ -742,13 +744,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();