diff --git a/src/View.cpp b/src/View.cpp index acbc3b55..ccb319a1 100644 --- a/src/View.cpp +++ b/src/View.cpp @@ -258,3 +258,8 @@ bool View::equals(const std::shared_ptr &other) const { return other && handle() == other->handle(); } + +bool View::isNull() const +{ + return false; +} diff --git a/src/View.h b/src/View.h index c6d2a269..d9fd6abf 100644 --- a/src/View.h +++ b/src/View.h @@ -93,6 +93,12 @@ public: /// as long as it uniquely identifies the GUI element. KDDW backend only uses it for comparison purposes virtual HANDLE handle() const = 0; + /// @brief Returns whether the gui item represented by this view was already deleted + /// Usually false, as KDDW internal gui elements inherit View, and nobody will access them after destruction. + /// However, ViewWrapper derived classes, wrap an existing gui element, which might get deleted. + /// Override isNull() in our ViewWrapper subclasses and return true if the wrapped gui element was already deleted + virtual bool isNull() const; + /// @brief Called by the layouting engine /// Override it in case your widget needs to know where it is in the layout. Usually only needed by Frame.s virtual void setLayoutItem(Layouting::Item *) {}; diff --git a/src/qtquick/views/ViewWrapper_qtquick.cpp b/src/qtquick/views/ViewWrapper_qtquick.cpp index 54af94a9..9db84b9b 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.cpp +++ b/src/qtquick/views/ViewWrapper_qtquick.cpp @@ -168,7 +168,7 @@ std::shared_ptr ViewWrapper_qtquick::parentView() const HANDLE ViewWrapper_qtquick::handle() const { - return reinterpret_cast(m_item); + return reinterpret_cast(m_item.data()); } void ViewWrapper_qtquick::grabMouse() @@ -192,3 +192,8 @@ QString ViewWrapper_qtquick::objectName() const { return {}; } + +bool ViewWrapper_qtquick::isNull() const +{ + return m_item.data() == nullptr; +} diff --git a/src/qtquick/views/ViewWrapper_qtquick.h b/src/qtquick/views/ViewWrapper_qtquick.h index 6f653503..da10e915 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.h +++ b/src/qtquick/views/ViewWrapper_qtquick.h @@ -14,6 +14,7 @@ #include "ViewWrapper.h" #include +#include namespace KDDockWidgets::Views { @@ -50,9 +51,10 @@ public: QScreen *screen() const override; void setFocus(Qt::FocusReason) override; QString objectName() const override; + bool isNull() const override; private: - QQuickItem *const m_item; + QPointer m_item; }; } diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp index c5d23689..0a09715f 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp @@ -243,7 +243,7 @@ std::shared_ptr ViewWrapper_qtwidgets::parentView() const HANDLE ViewWrapper_qtwidgets::handle() const { - return reinterpret_cast(m_widget); + return reinterpret_cast(m_widget.data()); } void ViewWrapper_qtwidgets::grabMouse() @@ -270,3 +270,8 @@ QString ViewWrapper_qtwidgets::objectName() const { return m_widget->QWidget::objectName(); } + +bool ViewWrapper_qtwidgets::isNull() const +{ + return m_widget.data() == nullptr; +} diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.h b/src/qtwidgets/views/ViewWrapper_qtwidgets.h index 90441ef4..3fd7ad36 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.h +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.h @@ -14,6 +14,7 @@ #include "ViewWrapper.h" #include +#include namespace KDDockWidgets::Views { @@ -50,9 +51,10 @@ public: QScreen *screen() const override; void setFocus(Qt::FocusReason) override; QString objectName() const override; + bool isNull() const override; private: - QWidget *const m_widget; + QPointer m_widget; }; }