diff --git a/src/View.h b/src/View.h index ed2eb487..bbb794c9 100644 --- a/src/View.h +++ b/src/View.h @@ -122,6 +122,7 @@ public: } virtual Qt::FocusPolicy focusPolicy() const = 0; + virtual bool hasFocus() const = 0; virtual QSize maxSizeHint() const = 0; virtual QSize maximumSize() const = 0; virtual QRect geometry() const = 0; diff --git a/src/qtquick/views/ViewWrapper_qtquick.cpp b/src/qtquick/views/ViewWrapper_qtquick.cpp index 57ab87be..485e3080 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.cpp +++ b/src/qtquick/views/ViewWrapper_qtquick.cpp @@ -211,8 +211,15 @@ Qt::FocusPolicy ViewWrapper_qtquick::focusPolicy() const } } -void ViewWrapper_qtquick::setFocus(Qt::FocusReason) +void ViewWrapper_qtquick::setFocus(Qt::FocusReason reason) { + m_item->QQuickItem::setFocus(true, reason); + m_item->forceActiveFocus(reason); +} + +bool ViewWrapper_qtquick::hasFocus() const +{ + return m_item->hasActiveFocus(); } QString ViewWrapper_qtquick::objectName() const diff --git a/src/qtquick/views/ViewWrapper_qtquick.h b/src/qtquick/views/ViewWrapper_qtquick.h index 6007f809..9c903229 100644 --- a/src/qtquick/views/ViewWrapper_qtquick.h +++ b/src/qtquick/views/ViewWrapper_qtquick.h @@ -62,6 +62,7 @@ public: QSize minSize() const override; bool close() override; Qt::FocusPolicy focusPolicy() const override; + bool hasFocus() const override; const View *unwrap() const; View *unwrap(); diff --git a/src/qtquick/views/View_qtquick.cpp b/src/qtquick/views/View_qtquick.cpp index 2e8dc878..33a24a19 100644 --- a/src/qtquick/views/View_qtquick.cpp +++ b/src/qtquick/views/View_qtquick.cpp @@ -744,6 +744,11 @@ void View_qtquick::setFocus(Qt::FocusReason reason) forceActiveFocus(reason); } +bool View_qtquick::hasFocus() const +{ + return QQuickItem::hasActiveFocus(); +} + Qt::FocusPolicy View_qtquick::focusPolicy() const { return m_focusPolicy; diff --git a/src/qtquick/views/View_qtquick.h b/src/qtquick/views/View_qtquick.h index 6bc4a909..59494d21 100644 --- a/src/qtquick/views/View_qtquick.h +++ b/src/qtquick/views/View_qtquick.h @@ -147,6 +147,8 @@ public: void releaseKeyboard() override; void setFocus(Qt::FocusReason reason) override; Qt::FocusPolicy focusPolicy() const override; + bool hasFocus() const override; + /// TODOv2: Make these 2 virtual ? void setFocusPolicy(Qt::FocusPolicy policy); QString objectName() const override; diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp index 66db8a82..d3f19550 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.cpp @@ -357,3 +357,8 @@ Qt::FocusPolicy ViewWrapper_qtwidgets::focusPolicy() const { return m_widget->focusPolicy(); } + +bool ViewWrapper_qtwidgets::hasFocus() const +{ + return m_widget->hasFocus(); +} diff --git a/src/qtwidgets/views/ViewWrapper_qtwidgets.h b/src/qtwidgets/views/ViewWrapper_qtwidgets.h index 644d3220..ce5beb29 100644 --- a/src/qtwidgets/views/ViewWrapper_qtwidgets.h +++ b/src/qtwidgets/views/ViewWrapper_qtwidgets.h @@ -63,6 +63,7 @@ public: void setCursor(Qt::CursorShape) override; QSize minSize() const override; Qt::FocusPolicy focusPolicy() const override; + bool hasFocus() const override; QWidget *widget() const; diff --git a/src/qtwidgets/views/View_qtwidgets.h b/src/qtwidgets/views/View_qtwidgets.h index c85abb15..956d2b98 100644 --- a/src/qtwidgets/views/View_qtwidgets.h +++ b/src/qtwidgets/views/View_qtwidgets.h @@ -341,6 +341,11 @@ public: return QWidget::focusPolicy(); } + bool hasFocus() const override + { + return QWidget::hasFocus(); + } + std::shared_ptr childViewAt(QPoint localPos) const override { if (QWidget *child = QWidget::childAt(localPos)) diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index 59e08f60..f1dbbf6f 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -2609,7 +2609,7 @@ void TestDocks::tst_isFocused() Platform::instance()->tests_waitForEvent(dock2->widget(), QEvent::FocusIn); QVERIFY(!dock1->isFocused()); - QVERIFY(dock2->widget()->hasFocus()); + QVERIFY(dock2->guestView()->hasFocus()); QVERIFY(dock2->isFocused()); // 4. Tab dock1, it's current tab now diff --git a/tests/tst_view.cpp b/tests/tst_view.cpp index 8b68206c..6a85cbe9 100644 --- a/tests/tst_view.cpp +++ b/tests/tst_view.cpp @@ -190,3 +190,15 @@ TEST_CASE("View::focusPolicy") auto rootView = Platform::instance()->tests_createView({}); CHECK_EQ(rootView->focusPolicy(), Qt::NoFocus); } + +TEST_CASE("View::hasFocus") +{ + auto rootView = Platform::instance()->tests_createView({}); + rootView->show(); + CHECK(rootView->isVisible()); + CHECK(!rootView->hasFocus()); + + // TODOv2: Uncomment once setFocusPolicy is implemented and implement in ViewWrapper too + // rootView->setFocus(Qt::MouseFocusReason); + // CHECK(rootView->hasFocus()); +}