diff --git a/inputeventitem.cpp b/inputeventitem.cpp index adda945f..91b5274f 100644 --- a/inputeventitem.cpp +++ b/inputeventitem.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later #include "inputeventitem.h" @@ -12,6 +12,33 @@ InputEventItem::InputEventItem() qApp->installEventFilter(this); } +QQuickItem* InputEventItem::inputMethodSource() const +{ + return m_inputMethodSource; +} + +void InputEventItem::setInputMethodSource(QQuickItem* source) +{ + if (m_inputMethodSource != source) { + m_inputMethodSource = source; + Q_EMIT inputMethodSourceChanged(); + } +} + +QVariant InputEventItem::inputMethodQuery(Qt::InputMethodQuery query) const +{ + if (m_inputMethodSource) { + if (query == Qt::ImCursorRectangle) { + QVariant result = m_inputMethodSource->inputMethodQuery(query); + QRectF rect = result.toRectF(); + QPointF mapped = m_inputMethodSource->mapToItem(this, rect.topLeft()); + rect.moveTopLeft(mapped); + return rect; + } + } + return QQuickItem::inputMethodQuery(query); +} + bool InputEventItem::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::InputMethod && (this->children().contains(obj) || obj == this)) { QInputMethodEvent *inputMethodEvent = static_cast(event); diff --git a/inputeventitem.h b/inputeventitem.h index 5bf41e0d..541c5445 100644 --- a/inputeventitem.h +++ b/inputeventitem.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later #ifndef INPUTEVENTITEM_H @@ -12,14 +12,24 @@ class InputEventItem : public QQuickItem { Q_OBJECT QML_ELEMENT + Q_PROPERTY(QQuickItem* inputMethodSource READ inputMethodSource WRITE setInputMethodSource NOTIFY inputMethodSourceChanged) public: InputEventItem(); + QQuickItem* inputMethodSource() const; + void setInputMethodSource(QQuickItem* source); + + QVariant inputMethodQuery(Qt::InputMethodQuery query) const override; + protected: bool eventFilter(QObject *obj, QEvent *event) override; signals: void inputReceived(const QString &input); + void inputMethodSourceChanged(); + +private: + QQuickItem* m_inputMethodSource = nullptr; }; #endif // INPUTEVENTITEM_H diff --git a/qml/FullscreenFrame.qml b/qml/FullscreenFrame.qml index df6c267e..c8b8cfdb 100644 --- a/qml/FullscreenFrame.qml +++ b/qml/FullscreenFrame.qml @@ -18,6 +18,8 @@ import 'windowed' as WindowedLaunchpad InputEventItem { anchors.fill: parent objectName: "FullscreenFrame-InputEventItem" + inputMethodSource: searchEdit + focus: true property Palette appTextColor: Palette { normal { diff --git a/qml/windowed/WindowedFrame.qml b/qml/windowed/WindowedFrame.qml index fc763c32..64cbd23e 100644 --- a/qml/windowed/WindowedFrame.qml +++ b/qml/windowed/WindowedFrame.qml @@ -16,6 +16,7 @@ import "." InputEventItem { id: baseLayer objectName: "WindowedFrame-BaseLayer" + inputMethodSource: bottomBar.searchEdit visible: true focus: true