diff --git a/src/private/quick/FrameQuick.cpp b/src/private/quick/FrameQuick.cpp index 4f78e74b..3fc96ced 100644 --- a/src/private/quick/FrameQuick.cpp +++ b/src/private/quick/FrameQuick.cpp @@ -35,16 +35,31 @@ FrameQuick::FrameQuick(QWidgetAdapter *parent, FrameOptions options) QQmlComponent component(Config::self().qmlEngine(), QUrl(QStringLiteral("qrc:/kddockwidgets/private/quick/qml/Frame.qml"))); - auto visualItem = static_cast(component.create()); + m_visualItem = static_cast(component.create()); - if (!visualItem) { + if (!m_visualItem) { qWarning() << Q_FUNC_INFO << "Failed to create item" << component.errorString(); return; } - visualItem->setProperty("frameCpp", QVariant::fromValue(this)); - visualItem->setParentItem(this); - visualItem->setParent(this); + m_visualItem->setProperty("frameCpp", QVariant::fromValue(this)); + m_visualItem->setParentItem(this); + m_visualItem->setParent(this); +} + +FrameQuick::~FrameQuick() +{ + { + const DockWidgetBase::List docks = dockWidgets(); + + // The QML item must be deleted with deleteLater(), has we might be currently with its mouse + // handler in the stack. QML doesn't support it being deleted in that case. + // So unparent it and deleteLater(). + m_visualItem->setParent(nullptr); + m_visualItem->deleteLater(); + + qDeleteAll(docks); + } } DockWidgetModel *FrameQuick::dockWidgetModel() const diff --git a/src/private/quick/FrameQuick_p.h b/src/private/quick/FrameQuick_p.h index ea67393a..8e8ea512 100644 --- a/src/private/quick/FrameQuick_p.h +++ b/src/private/quick/FrameQuick_p.h @@ -18,6 +18,8 @@ #include +class QQuickItem; + namespace KDDockWidgets { class DockWidgetModel; @@ -31,6 +33,7 @@ class DOCKS_EXPORT FrameQuick : public Frame Q_PROPERTY(DockWidgetModel* dockWidgetModel READ dockWidgetModel CONSTANT) public: explicit FrameQuick(QWidgetAdapter *parent = nullptr, FrameOptions = FrameOption::FrameOption_None); + ~FrameQuick() override; DockWidgetModel *dockWidgetModel() const; protected: @@ -50,6 +53,7 @@ Q_SIGNALS: void tabTitlesChanged(); private: QQuickItem *m_stackLayout = nullptr; + QQuickItem *m_visualItem = nullptr; DockWidgetBase *m_currentDockWidget = nullptr; DockWidgetModel *const m_dockWidgetModel; QHash m_connections; // To make it easy to disconnect from lambdas