From ead9e8945ec55530ee11c600cd834a5e777cd108 Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Mon, 5 Apr 2021 16:22:56 +0100 Subject: [PATCH] qtquick: Allow to add the guest widget declaratively This is an alternative to setting source --- examples/qtquick/dockwidgets/main.qml | 15 ++++++++++++--- src/private/quick/DockWidgetInstantiator.cpp | 15 +++++++++++---- src/private/quick/DockWidgetInstantiator_p.h | 1 - 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/examples/qtquick/dockwidgets/main.qml b/examples/qtquick/dockwidgets/main.qml index 54f24ab7..938ec27b 100644 --- a/examples/qtquick/dockwidgets/main.qml +++ b/examples/qtquick/dockwidgets/main.qml @@ -33,6 +33,15 @@ KDDW.MainWindowLayout { source: ":/Another.qml" } + KDDW.DockWidget { + id: dock5 + uniqueName: "dock5" + Rectangle { + id: guest + color: "pink" + } + } + Button { text: "Toggle Another" anchors { @@ -43,10 +52,10 @@ KDDW.MainWindowLayout { z: 10 onClicked: { - if (dock4.dockWidget.visible) { - dock4.dockWidget.close(); + if (dock5.dockWidget.visible) { + dock5.dockWidget.close(); } else { - dock4.dockWidget.show(); + dock5.dockWidget.show(); } } } diff --git a/src/private/quick/DockWidgetInstantiator.cpp b/src/private/quick/DockWidgetInstantiator.cpp index 5336a614..4587f449 100644 --- a/src/private/quick/DockWidgetInstantiator.cpp +++ b/src/private/quick/DockWidgetInstantiator.cpp @@ -63,14 +63,21 @@ void DockWidgetInstantiator::componentComplete() qWarning() << Q_FUNC_INFO << "Unexpected bug."; return; } - - if (m_sourceFilename.isEmpty()) { - qWarning() << Q_FUNC_INFO << "the 'source' property must be set."; + const auto childItems = this->childItems(); + if (m_sourceFilename.isEmpty() && childItems.size() != 1) { + qWarning() << Q_FUNC_INFO << "Either 'source' property must be set or add exactly one child" + << "; source=" << m_sourceFilename << "; num children=" << childItems.size(); return; } m_dockWidget = new DockWidgetQuick(m_uniqueName); - m_dockWidget->setWidget(m_sourceFilename); + + if (m_sourceFilename.isEmpty()) { + m_dockWidget->setWidget(childItems.constFirst()); + } else { + m_dockWidget->setWidget(m_sourceFilename); + } + Q_EMIT dockWidgetChanged(); } diff --git a/src/private/quick/DockWidgetInstantiator_p.h b/src/private/quick/DockWidgetInstantiator_p.h index 5252a3f5..1f661cf3 100644 --- a/src/private/quick/DockWidgetInstantiator_p.h +++ b/src/private/quick/DockWidgetInstantiator_p.h @@ -34,7 +34,6 @@ class DockWidgetQuick; class DockWidgetInstantiator : public QQuickItem { Q_OBJECT - Q_INTERFACES(QQmlParserStatus) Q_PROPERTY(QString uniqueName READ uniqueName WRITE setUniqueName NOTIFY uniqueNameChanged) Q_PROPERTY(QString source READ source WRITE setSource NOTIFY sourceChanged) Q_PROPERTY(KDDockWidgets::DockWidgetQuick *dockWidget READ dockWidget NOTIFY dockWidgetChanged)