diff --git a/src/gui/kernel/qinputmethod.cpp b/src/gui/kernel/qinputmethod.cpp index ea1978b5fb7..e37e85e246d 100644 --- a/src/gui/kernel/qinputmethod.cpp +++ b/src/gui/kernel/qinputmethod.cpp @@ -399,7 +399,11 @@ QVariant QInputMethod::queryFocusObject(Qt::InputMethodQuery query, const QVaria Q_ARG(Qt::InputMethodQuery, query), Q_ARG(QVariant, argument)); Q_ASSERT(ok); - return retval; + if (retval.isValid()) + return retval; + + // If the new API didn't have an answer to the query, we fall + // back to use the old event-based API. } QInputMethodQueryEvent queryEvent(query); diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index cf32ff6c93e..11604711946 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8896,8 +8896,18 @@ bool QWidget::event(QEvent *event) Qt::InputMethodQuery q = (Qt::InputMethodQuery)(int)(queries & (1<setValue(q, v); } } diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index f65882611b3..397a1cf8df7 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -369,6 +369,8 @@ private slots: void focusProxy(); void focusProxyAndInputMethods(); + void imEnabledNotImplemented(); + #ifdef QT_BUILD_INTERNAL void scrollWithoutBackingStore(); #endif @@ -10982,6 +10984,35 @@ void tst_QWidget::focusProxyAndInputMethods() QCOMPARE(qApp->focusObject(), toplevel.data()); } +void tst_QWidget::imEnabledNotImplemented() +{ + // Check that a plain widget doesn't report that it supports IM. Only + // widgets that implements either Qt::ImEnabled, or the Qt4 backup + // solution, Qt::ImSurroundingText, should do so. + QWidget topLevel; + QWidget plain(&topLevel); + QLineEdit edit(&topLevel); + topLevel.show(); + + QVERIFY(QTest::qWaitForWindowExposed(&topLevel)); + QApplication::setActiveWindow(&topLevel); + QVERIFY(QTest::qWaitForWindowActive(&topLevel)); + + // A plain widget should return false for ImEnabled + plain.setFocus(Qt::OtherFocusReason); + QCOMPARE(QApplication::focusWidget(), &plain); + QVariant imEnabled = QApplication::inputMethod()->queryFocusObject(Qt::ImEnabled, QVariant()); + QVERIFY(imEnabled.isValid()); + QVERIFY(!imEnabled.toBool()); + + // But a lineedit should return true + edit.setFocus(Qt::OtherFocusReason); + QCOMPARE(QApplication::focusWidget(), &edit); + imEnabled = QApplication::inputMethod()->queryFocusObject(Qt::ImEnabled, QVariant()); + QVERIFY(imEnabled.isValid()); + QVERIFY(imEnabled.toBool()); +} + #ifdef QT_BUILD_INTERNAL class scrollWidgetWBS : public QWidget {