diff --git a/src/DockWidgetBase.cpp b/src/DockWidgetBase.cpp index 84d106da..088d07ba 100644 --- a/src/DockWidgetBase.cpp +++ b/src/DockWidgetBase.cpp @@ -237,6 +237,17 @@ QString DockWidgetBase::uniqueName() const QString DockWidgetBase::title() const { + if (d->isMDIWrapper()) { + // It's just a wrapper to help implementing Option_MDINestable. Return the title of the real dock widget we're hosting. + auto dropAreaGuest = qobject_cast(widget()); + Q_ASSERT(dropAreaGuest); + if (dropAreaGuest->hasSingleFrame()) { + return dropAreaGuest->frames().constFirst()->title(); + } else { + return qApp->applicationName(); + } + } + return d->title; } diff --git a/src/private/DropArea.cpp b/src/private/DropArea.cpp index 70b69498..ae8d0295 100644 --- a/src/private/DropArea.cpp +++ b/src/private/DropArea.cpp @@ -47,6 +47,17 @@ DropArea::DropArea(QWidgetOrQuick *parent, bool isMDIWrapper) qWarning() << "Dropping not implement for QtQuick on Wayland yet!"; #endif } + + if (m_isMDIWrapper) { + connect(this, &MultiSplitter::visibleWidgetCountChanged, this, [this] { + if (auto dw = mdiDockWidgetWrapper()) { + // The title of our MDI frame will need to change to the app name if we have more than 1 dock widget nested + Q_EMIT dw->titleChanged(dw->title()); + } else { + qWarning() << Q_FUNC_INFO << "Unexpected null wrapper dock widget"; + } + }); + } } DropArea::~DropArea() diff --git a/src/private/Frame.cpp b/src/private/Frame.cpp index c651dd4c..4492e5e2 100644 --- a/src/private/Frame.cpp +++ b/src/private/Frame.cpp @@ -878,7 +878,10 @@ DockWidgetBase *Frame::mdiDockWidgetWrapper() const DropArea *Frame::mdiDropAreaWrapper() const { - return qobject_cast(QWidgetAdapter::parent()); + auto dropArea = qobject_cast(QWidgetAdapter::parent()); + if (dropArea && dropArea->isMDIWrapper()) + return dropArea; + return nullptr; } MDILayoutWidget *Frame::mdiLayoutWidget() const diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 84011349..31037939 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -5077,6 +5077,7 @@ void TestDocks::tst_mdi_mixed_with_docking2() auto createSheet = [](int id) -> DockWidgetBase* { auto dock = new DockWidget(QStringLiteral("dw-sheet-%1").arg(id), DockWidgetBase::Option_MDINestable); dock->setWidget(new QPushButton(QStringLiteral("Sheet %1").arg(id))); + dock->setTitle(QStringLiteral("Sheet %1").arg(id)); return dock; }; @@ -5109,6 +5110,7 @@ void TestDocks::tst_mdi_mixed_with_docking2() QVERIFY(dropArea2->isMDIWrapper()); QVERIFY(!mdiFrame1->isMDIWrapper()); QVERIFY(mdiFrame1->isMDI()); + QVERIFY(!mdiWidget1->d->isMDIWrapper()); auto tb1 = mdiWidget1->titleBar(); auto mdiTb1 = mdiFrame1->titleBar(); @@ -5119,6 +5121,9 @@ void TestDocks::tst_mdi_mixed_with_docking2() QVERIFY(mdiTb1->isVisible()); QVERIFY(mdiTb2->isVisible()); QVERIFY(tb1->isVisible()); + QCOMPARE(tb1->title(), QString("Sheet 1")); + QCOMPARE(mdiTb1->title(), QString("dockwidgets-unit-tests")); + QCOMPARE(mdiTb2->title(), QString("Sheet 2")); QVERIFY(tb1 != mdiTb1); QCOMPARE(mdiWidget2->titleBar(), mdiTb2);