Qt Android:当我在QLineEdit中输入时,虚拟键盘一直切换到大写

Qt Android: Virtual keyboard keeps switching to uppercase when I type in a QLineEdit

本文关键字:一直 键盘 虚拟 Android 输入 QLineEdit Qt      更新时间:2023-10-16

当我在QLineEdit中输入时,虚拟键盘以大写字母开头。即使我将它设置为小写,只要我键入一个字符,它就会返回到大写。也就是说,每次我输入一个字符,键盘就会再次重置为大写。

这种情况甚至发生在新创建的项目(我只是放了一个行编辑并运行它)。

我发现了一个关于同样问题的论坛帖子- https://groups.google.com/forum/#!topic/android-qt/QMFZmkACAIA.

我正在使用Qt/c++(不是QML)。

编辑:刚刚在一个新的QML项目上测试了它,错误也在那里。我还发现了一个关于QML的帖子- https://groups.google.com/forum/#!msg/android-qt/BzGDGoLNtYc/TdtOX9MW3vIJ。

Edit 2:我用inputmethodhint()进行了测试,唯一有效的是ImhNoAutoUppercase。但它仍然以一个大写字符开头,当按下后退键(删除最后一个字符)时,键盘将再次切换为大写字符,即使您已经键入了几个字母。在第一个字母之后,它会切换为小写,如果你不按后退键,它基本上可以正常工作。

Edit:一个比较好的解决方法是设置ImhNoAutoUppercase,第一个字母仍然是大写的,但至少你键入的下一个字母将是小写的。

原始答:在Android中,这将设置使用inputType在EditText的布局文件的xml中的活动/片段(屏幕/页面你正在看)。你可以访问和编辑布局文件直接为Android?

是否使用setInputMask()来控制输入类型?强制使用小写(或切换大小写转换)可能会提供使用大写或小写的选项。我猜在Android布局xml文件中设置的是inputType=" textcapsentence "或类似的东西(https://developer.android.com/training/keyboard-input/style.html)。

UPDATE:你提到这个问题在5.4中被修复了。这看起来像是可以修复它的提交。我建议只实现这里所示的修复。https://qt.gitorious.org/qt/qtbase/commit/2b3f293d892c5268bd2a07ed17fa9fc5adacbd76

你提到你很高兴编辑Qt源代码。我认为错误可能在src/org/qtproject/qt5/android/qtactical vitydelegate .java

        if ((inputHints & ImhUppercaseOnly) != 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
        } else if ((inputHints & ImhLowercaseOnly) == 0 && (inputHints & ImhNoAutoUppercase) == 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_SENTENCES; 
        }

应该改成:

        if ((inputHints & ImhUppercaseOnly) != 0) {
            initialCapsMode |= android.text.TextUtils.CAP_MODE_CHARACTERS;
            inputType |= android.text.InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS;
        } else if ((inputHints & ImhLowercaseOnly) == 0 && (inputHints & ImhNoAutoUppercase) == 0) {
            //initialCapsMode |= android.text.TextUtils.CAP_MODE_SENTENCES; // not sure what to set here - could try 0 or null if commenting out line doesn't work
            inputType |= android.text.InputType.TYPE_CLASS_TEXT; 
        }

如果这不能解决它,我建议搜索android.text.InputType的源代码。TYPE_TEXT_FLAG_CAP或android.text.TextUtils。CAP_MODE并用试错法替换它们。