Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qinputmethod.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <qinputmethod.h>
5#include <private/qinputmethod_p.h>
6#include <qguiapplication.h>
7#include <qtimer.h>
8#include <qpa/qplatforminputcontext_p.h>
9
10#include <QDebug>
11
13
17QInputMethod::QInputMethod()
19{
20}
21
25QInputMethod::~QInputMethod()
26{
27}
28
46{
47 Q_D(const QInputMethod);
48 return d->inputItemTransform;
49}
50
57{
58 Q_D(QInputMethod);
59 if (d->inputItemTransform == transform)
60 return;
61
62 d->inputItemTransform = transform;
65}
66
67
76{
77 Q_D(const QInputMethod);
78 return d->inputRectangle;
79}
80
89{
90 Q_D(QInputMethod);
91 d->inputRectangle = rect;
92}
93
95{
96 QRectF r;
97 if (QObject *focusObject = qGuiApp->focusObject()) {
99 QGuiApplication::sendEvent(focusObject, &query);
100 r = query.value(imquery).toRectF();
101 if (r.isValid())
102 r = xform.mapRect(r);
103 }
104 return r;
105}
106
115{
116 Q_D(const QInputMethod);
117 return inputMethodQueryRectangle_helper(Qt::ImCursorRectangle, d->inputItemTransform);
118}
119
128{
129 Q_D(const QInputMethod);
130 return inputMethodQueryRectangle_helper(Qt::ImAnchorRectangle, d->inputItemTransform);
131}
132
141{
142 Q_D(const QInputMethod);
143 QPlatformInputContext *ic = d->platformInputContext();
144 if (ic)
145 return ic->keyboardRect();
146 return QRectF();
147}
148
171{
172 Q_D(QInputMethod);
173 QPlatformInputContext *ic = d->platformInputContext();
174 if (ic)
175 ic->showInputPanel();
176}
177
186{
187 Q_D(QInputMethod);
188 QPlatformInputContext *ic = d->platformInputContext();
189 if (ic)
190 ic->hideInputPanel();
191}
192
203{
204 Q_D(const QInputMethod);
205 QPlatformInputContext *ic = d->platformInputContext();
206 if (ic)
207 return ic->isInputPanelVisible();
208 return false;
209}
210
218void QInputMethod::setVisible(bool visible)
219{
220 visible ? show() : hide();
221}
222
234{
235 Q_D(const QInputMethod);
236 QPlatformInputContext *ic = d->platformInputContext();
237 if (ic)
238 return ic->isAnimating();
239 return false;
240}
241
247{
248 Q_D(const QInputMethod);
249 QPlatformInputContext *ic = d->platformInputContext();
250 if (ic)
251 return ic->locale();
252 return QLocale::c();
253}
254
260{
261 Q_D(const QInputMethod);
262 QPlatformInputContext *ic = d->platformInputContext();
263 if (ic)
264 return ic->inputDirection();
265 return Qt::LeftToRight;
266}
267
279void QInputMethod::update(Qt::InputMethodQueries queries)
280{
281 Q_D(QInputMethod);
282
283 if (queries & Qt::ImEnabled) {
284 QObject *focus = qApp->focusObject();
285 bool enabled = d->objectAcceptsInputMethod(focus);
287 }
288
289 QPlatformInputContext *ic = d->platformInputContext();
290 if (ic)
291 ic->update(queries);
292
293 if (queries & Qt::ImCursorRectangle)
295
296 if (queries & (Qt::ImAnchorRectangle))
298
299 if (queries & (Qt::ImInputItemClipRectangle))
301}
302
310{
311 Q_D(QInputMethod);
312 QPlatformInputContext *ic = d->platformInputContext();
313 if (ic)
314 ic->reset();
315}
316
326{
327 Q_D(QInputMethod);
328 QPlatformInputContext *ic = d->platformInputContext();
329 if (ic)
330 ic->commit();
331}
332
349void QInputMethod::invokeAction(Action a, int cursorPosition)
350{
351 Q_D(QInputMethod);
352 QPlatformInputContext *ic = d->platformInputContext();
353 if (ic)
354 ic->invokeAction(a, cursorPosition);
355}
356
357static inline bool platformSupportsHiddenText()
358{
359 const QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext();
360 return inputContext && inputContext->hasCapability(QPlatformInputContext::HiddenTextCapability);
361}
362
364{
365 bool enabled = false;
366 if (object) {
367 // If the platform does not support hidden text, query the hints
368 // in addition and disable in case of ImhHiddenText.
369 static const bool supportsHiddenText = platformSupportsHiddenText();
370 QInputMethodQueryEvent query(supportsHiddenText
371 ? Qt::InputMethodQueries(Qt::ImEnabled)
372 : Qt::InputMethodQueries(Qt::ImEnabled | Qt::ImHints));
374 enabled = query.value(Qt::ImEnabled).toBool();
375 if (enabled && !supportsHiddenText
376 && Qt::InputMethodHints(query.value(Qt::ImHints).toInt()).testFlag(Qt::ImhHiddenText)) {
377 enabled = false;
378 }
379 }
380 return enabled;
381}
382
387{
388 QVariant retval;
389 QObject *focusObject = qGuiApp->focusObject();
390 if (!focusObject)
391 return retval;
392
393 static const char *signature = "inputMethodQuery(Qt::InputMethodQuery,QVariant)";
394 const bool newMethodSupported = focusObject->metaObject()->indexOfMethod(signature) != -1;
395 if (newMethodSupported) {
396 const bool ok = QMetaObject::invokeMethod(focusObject, "inputMethodQuery",
398 Q_RETURN_ARG(QVariant, retval),
401 Q_ASSERT(ok);
402 if (retval.isValid())
403 return retval;
404
405 // If the new API didn't have an answer to the query, we fall
406 // back to use the old event-based API.
407 }
408
409 QInputMethodQueryEvent queryEvent(query);
410 QCoreApplication::sendEvent(focusObject, &queryEvent);
411 return queryEvent.value(query);
412}
413
415
416#include "moc_qinputmethod.cpp"
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
static QPlatformIntegration * platformIntegration()
static bool objectAcceptsInputMethod(QObject *object)
The QInputMethodQueryEvent class provides an event sent by the input context to input objects.
Definition qevent.h:679
The QInputMethod class provides access to the active text input method.
QRectF cursorRectangle
Input item's cursor rectangle in window coordinates.
Action
Indicates the kind of action performed by the user.
void setInputItemTransform(const QTransform &transform)
Sets the transformation from input item coordinates to window coordinates to be transform.
Qt::LayoutDirection inputDirection
Current input direction.
void show()
Requests virtual keyboard to open.
void update(Qt::InputMethodQueries queries)
Called by the input item to inform the platform input methods when there has been state changes in ed...
void hide()
Requests virtual keyboard to close.
bool visible
Virtual keyboard's visibility on the screen.
void anchorRectangleChanged()
QRectF keyboardRectangle
Virtual keyboard's geometry in window coordinates.
void commit()
Commits the word user is currently composing to the editor.
QRectF anchorRectangle
Input item's anchor rectangle in window coordinates.
static QVariant queryFocusObject(Qt::InputMethodQuery query, const QVariant &argument)
Send query to the current focus object with parameters argument and return the result.
QRectF inputItemRectangle() const
void inputItemClipRectangleChanged()
QTransform inputItemTransform() const
Returns the transformation from input item coordinates to the window coordinates.
QLocale locale
Current input locale.
void invokeAction(Action a, int cursorPosition)
Called by the input item when the word currently being composed is tapped by the user,...
void cursorRectangleChanged()
bool isVisible() const
void reset()
Resets the input method state.
QRectF inputItemClipRectangle
Input item's clipped rectangle in window coordinates.
void setVisible(bool visible)
Controls the keyboard visibility.
void setInputItemRectangle(const QRectF &rect)
bool isAnimating() const
static QLocale c()
Returns a QLocale object initialized to the "C" locale.
Definition qlocale.h:1146
\inmodule QtCore
Definition qobject.h:103
static void setInputMethodAccepted(bool accepted)
The QPlatformInputContext class abstracts the input method dependent data and composing state.
virtual bool isInputPanelVisible() const
Returns input panel visibility status.
virtual bool isAnimating() const
This function can be reimplemented to return true whenever input method is animating shown or hidden.
virtual QLocale locale() const
virtual bool hasCapability(Capability capability) const
Returns whether the implementation supports capability.
virtual void update(Qt::InputMethodQueries)
Notification on editor updates.
virtual void invokeAction(QInputMethod::Action, int cursorPosition)
Called when the word currently being composed in the input item is tapped by the user.
virtual void reset()
Method to be called when input method needs to be reset.
virtual void showInputPanel()
Request to show input panel.
virtual Qt::LayoutDirection inputDirection() const
virtual void hideInputPanel()
Request to hide input panel.
virtual QRectF keyboardRect() const
This function can be reimplemented to return virtual keyboard rectangle in currently active window co...
\inmodule QtCore\reentrant
Definition qrect.h:484
The QTransform class specifies 2D transformations of a coordinate system.
Definition qtransform.h:20
QRect mapRect(const QRect &) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
\inmodule QtCore
Definition qvariant.h:65
bool focus
[0]
rect
[4]
Combined button and popup list for selecting options.
InputMethodQuery
@ ImAnchorRectangle
@ ImInputItemClipRectangle
@ ImCursorRectangle
@ ImHints
@ ImEnabled
LayoutDirection
@ LeftToRight
@ ImhHiddenText
@ DirectConnection
#define qApp
#define qGuiApp
static bool platformSupportsHiddenText()
static QRectF inputMethodQueryRectangle_helper(Qt::InputMethodQuery imquery, const QTransform &xform)
#define Q_RETURN_ARG(Type, data)
Definition qobjectdefs.h:64
#define Q_ARG(Type, data)
Definition qobjectdefs.h:63
GLboolean GLboolean GLboolean GLboolean a
[7]
GLboolean r
[2]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLuint GLenum GLenum transform
GLenum query
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define emit
#define enabled
QDBusArgument argument
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...