Qt / QML:带Keys.onPressed的TextInput只接收DEL键而不接收其他键

时间:2014-07-17 07:43:08

标签: android qt key qml textinput

系统:Qt / QML 5.3.1 Android与Windows QtCreator 设备:Samsung Tab 3 8“,Android 4.1.2

编辑: 我的主QML页面包含带Keys.onPressed的TextInput。此TextInput仅接收DEL键,而不接收标准虚拟键盘中的其他键。

如何接收TextInput / Keys.onPressed事件处理程序中的所有键?

import QtQuick 2.2
import QtQuick.Window 2.1
import QtQuick.Controls 1.2

ApplicationWindow {
visible: true
width: 640
height: 400

toolBar: ToolBar {
    Row {
        anchors.fill: parent
        ToolButton {
            text: "Exit"
            onClicked: Qt.quit();
        }
    }
}

TextInput {
    width: 200
    height: 40
    focus: true

    Keys.onPressed: {
        console.log("Key="+event.key+" "+event.text);
    }
    Keys.onReleased: {
        console.log("Key="+event.key+" "+event.text);
    }
}
}

当我按下虚拟键盘上的某个键时,Qt会引发错误,包括DEL键:

W / Qt(26304):kernel \ qmetaobject.cpp:1458(static bool QMetaObject :: invokeMethod(QObject *,const char *,Qt :: ConnectionType,QGenericReturnArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument ,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument)):QMetaObject :: invokeMethod:没有这样的方法QQuickTextInput :: inputMethodQuery(Qt :: InputMethodQuery,QVariant)

编辑(2014年10月27日): 出现此问题是因为它是Qt / Qml中缺少的功能,请参阅以下链接以进行讨论http://qt-project.org/forums/viewthread/45072/以及报告到Qt https://bugreports.qt-project.org/browse/QTBUG-40803的以下链接

1 个答案:

答案 0 :(得分:0)

分析

问题作者已经发现,此问题是由于Qt for Android中缺少功能(请参见QTBUG-40803

在三星设备(如平板电脑和智能手机)上,无法使用Keys.onPressedKeys.onRelease从虚拟键盘[从TextInput组件]接收键,除了 DEL < / kbd>和 ENTER 键。

问题不仅限于错误报告中所述的三星设备;例如,我的华硕Nexus 7上也有这种情况。错误报告中提到的 DEL 键是Android键盘的键(删除/退格键),而不是 Delete (Android键盘)不具有)。并非每次都发射此键的键事件,而仅在按下一个空的TextField时才发出。

此行为不同于Qt桌面应用程序,在Qt桌面应用程序中,物理输入的每个按键/释放事件均由TextInput发出信号。

解决方案

您无法收听Keys.onPressed / Keys.onReleased,但可以收听onTextEdited的{​​{1}}和onTextChanged信号。对于像在字段包含文本时启用按钮的简单情况,这些信号就足够了。对于其他情况,您可以分析键入了什么文本并根据用于该文本的键采取措施。

此解决方案由于另外两个错误而变得更加复杂:

  • 在Android平台上,TextInput不会发出textChanged()textEdited()信号,只要为Android键盘启用了预测文本输入({{3} })。我想它们最终会发出,但只有在通过键入空格字符或点击建议来“提交”一个单词之后才发出。如果您想对按键做出反应,那当然没有帮助。因此,您首先必须使用TextInput禁用预想输入法。

  • 在某些设备上,TextInput { inputMethodHints: Qt.ImhNoPredictiveText }不起作用(source)。然后,TextInput { inputMethodHints: Qt.ImhNoPredictiveText }是替代方法。可在Asus 7上使用。(这不会创建“密码输入字段” –文本仍将显示在该字段中,但是预想输入等已关闭。)

总而言之,一个可行的解决方案(对我来说适用于Nexus 7)如下所示:

inputMethodHints: Qt.ImhSensitiveData