系统: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的以下链接
答案 0 :(得分:0)
问题作者已经发现,此问题是由于Qt for Android中缺少功能(请参见QTBUG-40803)
在三星设备(如平板电脑和智能手机)上,无法使用
Keys.onPressed
或Keys.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