From eeba2de1b34083a7ebbba869475cd81575745efd Mon Sep 17 00:00:00 2001 From: Ivy233 Date: Fri, 13 Mar 2026 14:18:53 +0800 Subject: [PATCH] fix: forward InputMethodQuery to searchEdit for correct IME candidate window positioning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Override inputMethodQuery() virtual function in InputEventItem to forward input method queries to searchEdit. When IME queries cursor position for candidate window placement, the function forwards the query to searchEdit and maps the returned cursor rectangle coordinates from searchEdit's local coordinate system to InputEventItem's coordinate system. This ensures the candidate window appears at the correct position near the search box while keeping focus on InputEventItem. Changes: - Add inputMethodSource property to InputEventItem for specifying the text control to forward queries to - Override inputMethodQuery() to forward queries and map coordinates for ImCursorRectangle - Set inputMethodSource to searchEdit and add focus property in FullscreenFrame and WindowedFrame - Remove redundant ImEnabled override as SearchEdit already returns correct state 重写 InputEventItem 的 inputMethodQuery() 虚函数,将输入法查询转发给 searchEdit。当输入法查询光标位置以定位候选框时,该函数将查询转发给 searchEdit,并将返回的光标矩形坐标从 searchEdit 的局部坐标系映射到 InputEventItem 的坐标系。这确保候选框出现在搜索框附近的正确位置,同时焦点保持在 InputEventItem 上。 修改内容: - 为 InputEventItem 添加 inputMethodSource 属性,用于指定转发查询的文本控件 - 重写 inputMethodQuery() 以转发查询并映射 ImCursorRectangle 的坐标 - 在 FullscreenFrame 和 WindowedFrame 中设置 inputMethodSource 为 searchEdit 并添加 focus 属性 - 移除冗余的 ImEnabled 覆盖,因为 SearchEdit 已经返回正确状态 PMS: BUG-301743 --- inputeventitem.cpp | 29 ++++++++++++++++++++++++++++- inputeventitem.h | 12 +++++++++++- qml/FullscreenFrame.qml | 2 ++ qml/windowed/WindowedFrame.qml | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) 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