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.onPressedKeys.onRelease 从虚拟键盘 [来自 TextInput 组件] 接收键,DELENTER 键。

问题不仅限于错误报告中所述的三星设备;例如,它也发生在我的 Asus Nexus 7 上。错误报告中提到的 DEL 键是 Android 键盘的键 (Delete / Backspace),而不是 Delete(Android 键盘不具有)。此键的键事件并非每次都发出,而是仅在空的 TextField 中按下时发出。

这种行为不同于 Qt 桌面应用程序,其中物理键的每个按键/按键释放事件都由 TextInput 发出信号。

解决方案

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

另外两个错误使这个解决方案更加复杂:

在 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资源文件不会重新编译

Qt/QML:如何根据验证器找到 TextInput 最大宽度

如何将对话框锚定到listview qt qml中的按钮

Qt/QML:如何在 QML 中双向同步 ScrollView?

Qt/QML - 在 C++ 中注册 QML 类型会使 QML 代码不起作用