diff --git a/src/private/quick/FrameQuick.cpp b/src/private/quick/FrameQuick.cpp index a6223c8c..b7d86acd 100644 --- a/src/private/quick/FrameQuick.cpp +++ b/src/private/quick/FrameQuick.cpp @@ -173,6 +173,11 @@ QObject *FrameQuick::tabWidgetObj() const return m_tabWidget->asWidget(); } +TabWidget *FrameQuick::tabWidget() const +{ + return m_tabWidget; +} + int FrameQuick::nonContentsHeight() const { return m_visualItem->property("nonContentsHeight").toInt(); diff --git a/src/private/quick/FrameQuick_p.h b/src/private/quick/FrameQuick_p.h index 22f51171..5652540a 100644 --- a/src/private/quick/FrameQuick_p.h +++ b/src/private/quick/FrameQuick_p.h @@ -44,6 +44,9 @@ public: /// We can't return TabWidget directly as it's not a QObject QObject *tabWidgetObj() const; + /// @brief returns the tab widget + TabWidget *tabWidget() const; + protected: void removeWidget_impl(DockWidgetBase *) override; int indexOfDockWidget_impl(DockWidgetBase *) override; diff --git a/src/private/quick/TabBarQuick.cpp b/src/private/quick/TabBarQuick.cpp index 02e5784f..3a4e36aa 100644 --- a/src/private/quick/TabBarQuick.cpp +++ b/src/private/quick/TabBarQuick.cpp @@ -66,11 +66,15 @@ void TabBarQuick::setTabBarQmlItem(QQuickItem *item) bool TabBarQuick::event(QEvent *ev) { switch (ev->type()) { + case QEvent::MouseButtonDblClick: case QEvent::MouseButtonPress: { if (m_tabBarQmlItem) { auto me = static_cast(ev); m_tabBarQmlItem->setProperty("currentIndex", tabAt(me->pos())); - TabBar::onMousePress(me->pos()); + if (ev->type() == QEvent::MouseButtonPress) + TabBar::onMousePress(me->pos()); + else + TabBar::onMouseDoubleClick(me->pos()); } break; diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 281e9ebf..5e07208a 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -138,6 +138,7 @@ private Q_SLOTS: void tst_invalidLayoutAfterRestore(); void tst_tabWidgetCurrentIndex(); + void tst_doubleClickTabToDetach(); void tst_propagateResize2(); void tst_negativeAnchorPosition(); void tst_negativeAnchorPosition2(); @@ -5967,6 +5968,34 @@ void TestDocks::tst_tabWidgetCurrentIndex() delete dock1->window(); } +void TestDocks::tst_doubleClickTabToDetach() +{ + EnsureTopLevelsDeleted e; + + auto dock1 = createDockWidget("1", new QPushButton("1")); + auto dock2 = createDockWidget("2", new QPushButton("2")); + + auto fw2 = dock2->window(); + + dock1->addDockWidgetAsTab(dock2); + + auto frame = dock1->frame(); + QCOMPARE(frame->currentIndex(), 1); + + auto tb = frame->tabWidget()->asWidget(); + + Tests::doubleClickOn(tb->mapToGlobal({ 20, 20 }), frame->window()->windowHandle()); + + QVERIFY(dock1->isFloating()); + QVERIFY(dock2->isFloating()); + QVERIFY(dock1->floatingWindow() != dock2->floatingWindow()); + + + delete fw2; + delete dock1->window(); + delete dock2->window(); +} + void TestDocks::tst_addingOptionHiddenTabbed() { EnsureTopLevelsDeleted e;