diff --git a/src/private/quick/FrameQuick.cpp b/src/private/quick/FrameQuick.cpp index fdf32574..57ba6a25 100644 --- a/src/private/quick/FrameQuick.cpp +++ b/src/private/quick/FrameQuick.cpp @@ -53,6 +53,7 @@ DockWidgetModel *FrameQuick::dockWidgetModel() const void FrameQuick::removeWidget_impl(DockWidgetBase *dw) { m_dockWidgetModel->remove(dw); + disconnect(m_connections.take(dw)); } void FrameQuick::detachTab_impl(DockWidgetBase *) @@ -93,6 +94,13 @@ void FrameQuick::insertDockWidget_impl(DockWidgetBase *dw, int index) if (m_dockWidgetModel->insert(dw, index)) { dw->setParent(m_stackLayout); + QMetaObject::Connection conn = connect(dw, &DockWidgetBase::parentChanged, this, [dw, this] { + if (dw->parent() != m_stackLayout) + removeWidget_impl(dw); + }); + + m_connections[dw] = conn; + if (!m_currentDockWidget) m_currentDockWidget = dw; } @@ -191,8 +199,9 @@ void DockWidgetModel::remove(DockWidgetBase *dw) if (row == -1) { qWarning() << Q_FUNC_INFO << "Nothing to remove" << dw; } else { - disconnect(m_connections.value(dw)); - m_connections.remove(dw); + const auto connections = m_connections.take(dw); + for (QMetaObject::Connection conn : connections) + disconnect(conn); beginRemoveRows(QModelIndex(), row, row); m_dockWidgets.removeOne(dw); @@ -214,11 +223,11 @@ bool DockWidgetModel::insert(DockWidgetBase *dw, int index) return false; } - QMetaObject::Connection c = connect(dw, &DockWidgetBase::titleChanged, this, [dw, this] { + QMetaObject::Connection conn = connect(dw, &DockWidgetBase::titleChanged, this, [dw, this] { emitDataChangedFor(dw); }); - m_connections.insert(dw, c); + m_connections[dw] = { conn }; beginInsertRows(QModelIndex(), index, index); m_dockWidgets.insert(index, dw); diff --git a/src/private/quick/FrameQuick_p.h b/src/private/quick/FrameQuick_p.h index 862110f2..48fd22cf 100644 --- a/src/private/quick/FrameQuick_p.h +++ b/src/private/quick/FrameQuick_p.h @@ -53,6 +53,7 @@ private: QQuickItem *m_stackLayout = nullptr; DockWidgetBase *m_currentDockWidget = nullptr; DockWidgetModel *const m_dockWidgetModel; + QHash m_connections; // To make it easy to disconnect from lambdas }; class DockWidgetModel : public QAbstractListModel @@ -79,7 +80,7 @@ Q_SIGNALS: private: void emitDataChangedFor(DockWidgetBase *); DockWidgetBase::List m_dockWidgets; - QHash m_connections; // To make it easy to disconnect from lambda + QHash > m_connections; // To make it easy to disconnect from lambdas }; } diff --git a/src/private/quick/QWidgetAdapter_quick.cpp b/src/private/quick/QWidgetAdapter_quick.cpp index b45666f3..97fe4fa7 100644 --- a/src/private/quick/QWidgetAdapter_quick.cpp +++ b/src/private/quick/QWidgetAdapter_quick.cpp @@ -71,6 +71,7 @@ void QWidgetAdapter::itemChange(QQuickItem::ItemChange change, const QQuickItem: case QQuickItem::ItemVisibleHasChanged: { QEvent ev(QEvent::ParentChange); event(&ev); + Q_EMIT parentChanged(); break; } case QQuickItem::ItemParentHasChanged: { diff --git a/src/private/quick/QWidgetAdapter_quick_p.h b/src/private/quick/QWidgetAdapter_quick_p.h index 38c46be8..6f422f17 100644 --- a/src/private/quick/QWidgetAdapter_quick_p.h +++ b/src/private/quick/QWidgetAdapter_quick_p.h @@ -106,6 +106,8 @@ public: Qt::WindowFlags windowFlags() const; QQuickItem *createItem(QQmlEngine *, const QString &filename) const; +Q_SIGNALS: + void parentChanged(); protected: void raiseAndActivate(); virtual bool onResize(QSize newSize); diff --git a/src/private/quick/qml/FloatingWindow.qml b/src/private/quick/qml/FloatingWindow.qml index 5b227e1e..65a90a5e 100644 --- a/src/private/quick/qml/FloatingWindow.qml +++ b/src/private/quick/qml/FloatingWindow.qml @@ -47,7 +47,9 @@ Rectangle { onDropAreaCppChanged: { // Parent the cpp obj to the visual obj. So the user can style it - dropAreaCpp.parent = dropArea; - dropAreaCpp.anchors.fill = dropArea; + if (dropAreaCpp) { + dropAreaCpp.parent = dropArea; + dropAreaCpp.anchors.fill = dropArea; + } } } diff --git a/src/private/quick/qml/Frame.qml b/src/private/quick/qml/Frame.qml index 8941429b..2f7a43a7 100644 --- a/src/private/quick/qml/Frame.qml +++ b/src/private/quick/qml/Frame.qml @@ -22,7 +22,8 @@ Rectangle { anchors.fill: parent onFrameCppChanged: { - frameCpp.setStackLayout(stackLayout); + if (frameCpp) + frameCpp.setStackLayout(stackLayout); } TitleBar { diff --git a/src/private/quick/qml/TitleBarBase.qml b/src/private/quick/qml/TitleBarBase.qml index 10021595..96c614f7 100644 --- a/src/private/quick/qml/TitleBarBase.qml +++ b/src/private/quick/qml/TitleBarBase.qml @@ -26,6 +26,7 @@ Rectangle { } onTitleBarCppChanged: { - titleBarCpp.filterEvents(dragMouseArea) + if (titleBarCpp) + titleBarCpp.filterEvents(dragMouseArea) } }