Android: Set EnterKeyNext as default type for QLineEdit
Behavior of EnterKey for virtual keyboard need to be changed for QLineEdit. Before this commit, ImeOption was set to IME_ACTION_DONE. Because of that, setting any text in QLineEdit automatically accept QDialogs. That was annoying, when more than one QLineEdit need to be set. [ChangeLog][Widgets][Android] EnterKey type is now changed from EnterKeyDefault to EnterKeyNext for virtual keyboard in QLineEdit. It is done only if the focus can be moved to widget below. Fixes: QTBUG-61652 Change-Id: I98a7686f9f675fccf0112b8d27d48ad8fd7a887f Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io> Reviewed-by: Ville Voutilainen <ville.voutilainen@qt.io>
This commit is contained in:
parent
4b892b1034
commit
02f1e72d5a
@ -1802,6 +1802,22 @@ void QLineEdit::inputMethodEvent(QInputMethodEvent *e)
|
|||||||
*/
|
*/
|
||||||
QVariant QLineEdit::inputMethodQuery(Qt::InputMethodQuery property) const
|
QVariant QLineEdit::inputMethodQuery(Qt::InputMethodQuery property) const
|
||||||
{
|
{
|
||||||
|
#ifdef Q_OS_ANDROID
|
||||||
|
// QTBUG-61652
|
||||||
|
if (property == Qt::ImEnterKeyType) {
|
||||||
|
QWidget *next = nextInFocusChain();
|
||||||
|
while (next && next != this && next->focusPolicy() == Qt::NoFocus)
|
||||||
|
next = next->nextInFocusChain();
|
||||||
|
if (next) {
|
||||||
|
const auto nextYPos = next->mapToGlobal(QPoint(0, 0)).y();
|
||||||
|
const auto currentYPos = mapToGlobal(QPoint(0, 0)).y();
|
||||||
|
if (currentYPos < nextYPos)
|
||||||
|
// Set EnterKey to KeyNext type only if the next widget
|
||||||
|
// in the focus chain is below current QLineEdit
|
||||||
|
return Qt::EnterKeyNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return inputMethodQuery(property, QVariant());
|
return inputMethodQuery(property, QVariant());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +267,8 @@ private slots:
|
|||||||
void inputMethodQueryImHints_data();
|
void inputMethodQueryImHints_data();
|
||||||
void inputMethodQueryImHints();
|
void inputMethodQueryImHints();
|
||||||
|
|
||||||
|
void inputMethodQueryEnterKeyType();
|
||||||
|
|
||||||
void inputMethodUpdate();
|
void inputMethodUpdate();
|
||||||
|
|
||||||
void undoRedoAndEchoModes_data();
|
void undoRedoAndEchoModes_data();
|
||||||
@ -4409,6 +4411,33 @@ void tst_QLineEdit::inputMethodQueryImHints()
|
|||||||
QCOMPARE(static_cast<Qt::InputMethodHints>(value.toInt()), hints);
|
QCOMPARE(static_cast<Qt::InputMethodHints>(value.toInt()), hints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QLineEdit::inputMethodQueryEnterKeyType()
|
||||||
|
{
|
||||||
|
QWidget mw;
|
||||||
|
QVBoxLayout layout(&mw);
|
||||||
|
QLineEdit le1(&mw);
|
||||||
|
layout.addWidget(&le1);
|
||||||
|
mw.show();
|
||||||
|
QVariant enterType = le1.inputMethodQuery(Qt::ImEnterKeyType);
|
||||||
|
QCOMPARE(enterType.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault);
|
||||||
|
|
||||||
|
mw.hide();
|
||||||
|
QLineEdit le2(&mw);
|
||||||
|
layout.addWidget(&le2);
|
||||||
|
mw.show();
|
||||||
|
|
||||||
|
enterType = le1.inputMethodQuery(Qt::ImEnterKeyType);
|
||||||
|
#ifdef Q_OS_ANDROID
|
||||||
|
// QTBUG-61652
|
||||||
|
// EnterKey is changed to EnterKeyNext if the focus can be moved to widget below
|
||||||
|
QCOMPARE(enterType.value<Qt::EnterKeyType>(), Qt::EnterKeyNext);
|
||||||
|
#else
|
||||||
|
QCOMPARE(enterType.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault);
|
||||||
|
#endif
|
||||||
|
enterType = le2.inputMethodQuery(Qt::ImEnterKeyType);
|
||||||
|
QCOMPARE(enterType.value<Qt::EnterKeyType>(), Qt::EnterKeyDefault);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QLineEdit::inputMethodUpdate()
|
void tst_QLineEdit::inputMethodUpdate()
|
||||||
{
|
{
|
||||||
if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
|
if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user