Qt/QML:带有 Keys.onPressed 的 TextInput 仅接收 DEL 键而不接收其他键
Posted
技术标签:
【中文标题】Qt/QML:带有 Keys.onPressed 的 TextInput 仅接收 DEL 键而不接收其他键【英文标题】:Qt/QML: TextInput with Keys.onPressed receives only DEL key and not other keys 【发布时间】:2014-09-07 23:25:31 【问题描述】:系统:Qt/QML 5.3.1 android 与 Windows QtCreator 设备:三星 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);
当我按下虚拟键盘上的一个键(包括 DEL 键)时,Qt 引发错误:
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
【问题讨论】:
请提供一个工作示例来演示您的问题,而不是在文本字段中输入但无法运行的示例。 @Mitch:用运行示例编辑了我的问题。 【参考方案1】:分析
正如问题作者已经发现的那样,此问题是由于 Qt for Android 中缺少功能(请参阅QTBUG-40803):
在三星设备(如平板电脑和智能手机)上,无法通过使用
Keys.onPressed
或Keys.onRelease
从虚拟键盘 [来自 TextInput 组件] 接收键,DEL 和ENTER 键。
问题不仅限于错误报告中所述的三星设备;例如,它也发生在我的 Asus Nexus 7 上。错误报告中提到的 DEL 键是 Android 键盘的键 ⌫(Delete / Backspace),而不是 Delete(Android 键盘不具有)。此键的键事件并非每次都发出,而是仅在空的 TextField 中按下时发出。
这种行为不同于 Qt 桌面应用程序,其中物理键的每个按键/按键释放事件都由 TextInput 发出信号。
解决方案
您无法收听Keys.onPressed
/ Keys.onReleased
,但可以收听TextInput
的onTextEdited
和onTextChanged
信号。对于像在字段包含文本时启用按钮这样的简单情况,这些信号就足够了。对于其他情况,您可以分析输入的文本并根据用于该操作的键采取措施。
另外两个错误使这个解决方案更加复杂:
在 Android 平台上,只要为 Android 键盘 (source) 启用了预测文本输入,TextInput
就不会发出 textChanged()
和 textEdited()
信号。我想它们最终会发出,但只有在通过输入空格字符或点击建议“提交”一个单词之后。当然,如果您想对按键做出反应,那将无济于事。因此,您首先必须使用 TextInput inputMethodHints: Qt.ImhNoPredictiveText
禁用预测文本输入行为。
在某些设备上,TextInput inputMethodHints: Qt.ImhNoPredictiveText
无效 (QTBUG-37533)。然后,inputMethodHints: Qt.ImhSensitiveData
是一个替代方案。适用于华硕 7。(这不会创建“密码输入字段” - 文本仍将显示在字段中,但预测输入等已关闭。)
综合起来,一个可行的解决方案(对我来说在 Nexus 7 上)如下所示:
TextField
inputMethodHints: Qt.ImhSensitiveData
onTextEdited:
console.log("textEdited() signal received")
【讨论】:
以上是关于Qt/QML:带有 Keys.onPressed 的 TextInput 仅接收 DEL 键而不接收其他键的主要内容,如果未能解决你的问题,请参考以下文章
带有几个键的 QT3D QML RenderPassFilter 似乎有问题
Qt/QML:如何根据验证器找到 TextInput 最大宽度