diff --git a/src/private/DockRegistry.cpp b/src/private/DockRegistry.cpp index 3074e8a9..cd5110af 100644 --- a/src/private/DockRegistry.cpp +++ b/src/private/DockRegistry.cpp @@ -540,7 +540,6 @@ const Window::List DockRegistry::floatingQWindows() const for (Controllers::FloatingWindow *fw : m_floatingWindows) { if (!fw->beingDeleted()) { if (Window::Ptr window = fw->view()->windowHandle()) { - window->setProperty("kddockwidgets_qwidget", QVariant::fromValue(fw->view()->asQWidget())); // Since QWidgetWindow is private API windows.push_back(window); } else { qWarning() << Q_FUNC_INFO << "FloatingWindow doesn't have QWindow"; @@ -608,8 +607,7 @@ Window::List DockRegistry::topLevels(bool excludeFloatingDocks) const if (!excludeFloatingDocks) { for (Controllers::FloatingWindow *fw : m_floatingWindows) { if (fw->isVisible()) { - if (auto window = fw->view()->windowHandle()) { - window->setProperty("kddockwidgets_qwidget", QVariant::fromValue(fw->view()->asQWidget())); // Since QWidgetWindow is private API + if (Window::Ptr window = fw->view()->windowHandle()) { windows << window; } else { qWarning() << Q_FUNC_INFO << "FloatingWindow doesn't have QWindow"; @@ -621,7 +619,6 @@ Window::List DockRegistry::topLevels(bool excludeFloatingDocks) const for (Controllers::MainWindow *m : m_mainWindows) { if (m->isVisible()) { if (Window::Ptr window = m->view()->windowHandle()) { - window->setProperty("kddockwidgets_qwidget", QVariant::fromValue(m->view()->asQWidget())); windows << window; } else { qWarning() << Q_FUNC_INFO << "MainWindow doesn't have QWindow"; diff --git a/src/qtwidgets/Window_qtwidgets.cpp b/src/qtwidgets/Window_qtwidgets.cpp index bfd98d72..c656b263 100644 --- a/src/qtwidgets/Window_qtwidgets.cpp +++ b/src/qtwidgets/Window_qtwidgets.cpp @@ -21,6 +21,14 @@ using namespace KDDockWidgets; Window_qtwidgets::~Window_qtwidgets() = default; +Window_qtwidgets::Window_qtwidgets(QWidget *topLevel) + : Window_qt(topLevel->windowHandle()) +{ + // QWidgetWindow is private API, we have no way for going from QWindow to the top-level QWidget + // So set it as a property + setProperty("kddockwidgets_qwidget", QVariant::fromValue(topLevel)); +} + std::shared_ptr Window_qtwidgets::rootView() const { if (!m_window) diff --git a/src/qtwidgets/Window_qtwidgets.h b/src/qtwidgets/Window_qtwidgets.h index 08797920..ec2cac20 100644 --- a/src/qtwidgets/Window_qtwidgets.h +++ b/src/qtwidgets/Window_qtwidgets.h @@ -18,6 +18,8 @@ class DOCKS_EXPORT Window_qtwidgets : public Window_qt { public: using Window_qt::Window_qt; + + explicit Window_qtwidgets(QWidget *topLevel); ~Window_qtwidgets() override; std::shared_ptr rootView() const override; Window::Ptr transientParent() const override; diff --git a/src/qtwidgets/views/View_qtwidgets.h b/src/qtwidgets/views/View_qtwidgets.h index 9b2586ba..8e653955 100644 --- a/src/qtwidgets/views/View_qtwidgets.h +++ b/src/qtwidgets/views/View_qtwidgets.h @@ -348,8 +348,8 @@ public: std::shared_ptr windowHandle() const override { if (QWidget *root = QWidget::window()) { - if (QWindow *window = root->windowHandle()) { - return std::shared_ptr(new Window_qtwidgets(window)); + if (root->windowHandle()) { + return std::shared_ptr(new Window_qtwidgets(root)); } }