Workaround quickwidget cursor position issue

This commit is contained in:
Weng Xuetian 2017-11-08 16:06:21 -08:00
parent 306240d6da
commit 9c2654cf5f
3 changed files with 21 additions and 1 deletions

View File

@ -16,7 +16,7 @@ include(ECMSetupVersion)
include(ECMGenerateHeaders)
include(ECMUninstallTarget)
find_package(Qt5 ${REQUIRED_QT5_VERSION} CONFIG REQUIRED Core DBus Widgets X11Extras)
find_package(Qt5 ${REQUIRED_QT5_VERSION} CONFIG REQUIRED Core DBus Widgets X11Extras QuickWidgets)
find_package(XCB REQUIRED COMPONENTS XCB)
find_package(Qt5Gui ${REQUIRED_QT5_VERSION} REQUIRED Private)
find_package(XKBCommon 0.5.0 REQUIRED COMPONENTS XKBCommon)

View File

@ -24,6 +24,7 @@ target_link_libraries(fcitx5platforminputcontextplugin
Qt5::Gui
Qt5::DBus
Qt5::X11Extras
Qt5::QuickWidgets
XCB::XCB
Fcitx5::Utils
Fcitx5Qt5::DBusAddons

View File

@ -18,10 +18,13 @@
*/
#include <QDBusConnection>
#include <QDebug>
#include <QGuiApplication>
#include <QInputMethod>
#include <QKeyEvent>
#include <QPalette>
#include <QQuickItem>
#include <QQuickWidget>
#include <QTextCharFormat>
#include <QTextCodec>
#include <QWindow>
@ -379,6 +382,22 @@ void QFcitxPlatformInputContext::cursorRectChanged() {
return;
}
// QQuickWidget workaround.
auto obj = qApp->focusObject();
if (auto quickwidget = qobject_cast<QQuickWidget *>(obj)) {
auto realObj = quickwidget->quickWindow()->focusObject();
if (auto quickitem = qobject_cast<QQuickItem *>(realObj)) {
QInputMethodQueryEvent query(Qt::ImCursorRectangle);
QGuiApplication::sendEvent(realObj, &query);
auto rect = query.value(Qt::ImCursorRectangle).toRectF();
r = qApp->inputMethod()
->inputItemTransform()
.mapRect(quickitem->mapRectToScene(rect))
.toRect();
}
}
qreal scale = inputWindow->devicePixelRatio();
auto screenGeometry = inputWindow->screen()->geometry();
auto point = inputWindow->mapToGlobal(r.topLeft());