Qt Android: виртуальная клавиатура продолжает переключаться на верхний регистр, когда я набираю QLineEdit

Когда я набираю QLineEdit, виртуальная клавиатура начинается с верхнего регистра. Даже если я установлю его в нижний регистр, он вернется в верхний регистр, как только я наберу один символ. То есть каждый раз, когда я набираю символ, клавиатура снова сбрасывается в верхний регистр.

Это происходит даже в только что созданном проекте (я просто ставлю строку редактирования и запускаю его).

Я нашел ветку форума по той же проблеме - https://groups.google.com/forum/#!topic/android-qt/QMFZmkACAIA.

Я использую Qt/С++ (не QML).

Редактировать: Только что протестировал его в новом проекте QML, ошибка тоже есть. Я также нашел сообщение об этом для QML - https://groups.google.com/forum/#!msg/android-qt/BzGDGoLNtYc/TdtOX9MW3vIJ.

Редактировать 2: я тестировал с помощью inputMethodHints(), и единственным, который дал эффект, был ImhNoAutoUppercase. Но потом все равно начиналось с прописной буквы, а при нажатии на кнопку назад (для удаления последнего символа) клавиатура снова переключается на прописную, даже если вы набрали несколько букв. После первой буквы он переключается на нижний регистр, и если вы не нажимаете кнопку «Назад», он работает в основном нормально.


person sashoalm    schedule 12.08.2014    source источник
comment
Я надеюсь, что эта ссылка поможет, но я не знаком с ней. Извините, я больше ничем помочь не могу: grokbase.com/t/gg /android-qt/12akn19zck/qlineedit-issue   -  person Zac Wimer    schedule 06.09.2014


Ответы (1)


Редактировать: хорошим обходным решением является установка ImhNoAutoUppercase, первая буква по-прежнему будет заглавной, но, по крайней мере, следующие введенные вами буквы будут строчными.

Исходный ответ: в Android это будет установлено с помощью inputType в EditText в xml файла макета для Activity/Fragment (экран/страница, на которую вы смотрите). Можете ли вы получить доступ и редактировать файл макета непосредственно для Android?

Используете ли вы setInputMask() для управления типом ввода? Возможно, принудительное использование нижнего регистра (или переключение преобразования регистра) дает возможность использовать верхний или нижний регистр. Я предполагаю, что в XML-файле макета Android устанавливается inputType="textCapSentences" или что-то подобное ( https://developer.android.com/training/keyboard-input/style.html).

ОБНОВЛЕНИЕ: Вы упомянули, что проблема исправлена ​​в версии 5.4. Это похоже на коммит, который это исправит. Я бы предложил просто реализовать исправления, показанные здесь. https://qt.gitorious.org/qt/qtbase/commit/2b3f293d892c5268bd2a07ed17fa9fc5adacbd76

Вы упомянули, что готовы редактировать исходный код Qt. Я думаю, что ошибка может быть в этой части src/org/qtproject/qt5/android/QtActivityDelegate.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 и заменить их методом проб и ошибок.

person TTransmit    schedule 14.01.2015
comment
Это происходит в только что созданном проекте с редактированием строки. - person sashoalm; 14.01.2015
comment
Использование setInputMask останавливает первый символ в верхнем регистре? Как насчет установки QValidator? - person TTransmit; 14.01.2015
comment
Сейчас я немного занят, но я постараюсь проверить ваши предложения сегодня или завтра. - person sashoalm; 15.01.2015
comment
У меня есть файл AndroidManifest.xml, который выглядит так: pastebin.com/CadhLGEi. Это где я должен поместить inputType? - person sashoalm; 16.01.2015
comment
Чтобы изменить inputType в xml в Android, вы обычно работаете с файлами res/layouts или styles.xml. Если AndroidManifest.xml является единственным XML-файлом, к которому вы можете получить доступ, этот подход не будет работать. Я думаю, setInputMask и QValidator будут установлены на C++ для рассматриваемого QLineEdit. Возможно, вам просто повезло, так как кто-то из моих знакомых вчера спросил меня, не хочу ли я устроиться на работу в Qt, что дало мне повод настроить Qt. Я вижу проблему в исходном коде Qt Android. Мне нужно настроить Qt, чтобы протестировать то, что я считаю решением. - person TTransmit; 17.01.2015
comment
Я только что получил возможность попробовать это на 5.4 и увидел, что это было исправлено, но я обновил свой ответ, который, надеюсь, может вам помочь. - person TTransmit; 17.01.2015
comment
Что касается setInputMask, не будет ли этот подход ограничивать набор ключей, которые можно вводить? Я бы предпочел не ограничивать их, я все еще хочу, чтобы можно было вводить прописные буквы. Сейчас попробую ваши новые предложения. - person sashoalm; 18.01.2015
comment
Я пробовал setInputMask. Это было неясно, но он может работать отдельно от и после Android EditText и клавиатуры, поэтому он может не работать для того, что вы хотите. - person TTransmit; 18.01.2015
comment
В каталоге установки Qt или в каталогах сборки нет QtActivityDelegate.java. Это странно, может быть, он уже предварительно скомпилирован и помещен в файлы .jar? - person sashoalm; 18.01.2015
comment
Я нашел QtActivityDelegate.java, но он находится в каталоге src/ и, кажется, уже скомпилирован внутри файлов .jar, которые использует Qt. Если я попытаюсь поместить модифицированный QtActivityDelegate.java в свой $ANDROID_PACKAGE_SOURCE_DIR, я получу эту ошибку - pastebin.com/D9BS3XUu - person sashoalm; 18.01.2015
comment
Ошибка предполагает, что система недовольна наличием двух версий QtActivityDelegate.java: вашей версии и версии в банке. Это будет означать создание собственной версии jar (или импорт его как проекта в Eclipse или Android Studio). Я не уверен в процессе для Qt, возможно, у них есть процесс для этого с использованием инструмента сборки для участников. У них есть список рассылки ( lists.qt-project.org/mailman/listinfo/ android-development ), кто-то может помочь вам, в том числе с исправлением проблемы, с которой вы столкнулись с заглавными буквами. - person TTransmit; 18.01.2015
comment
Что ж, спасибо за помощь, вот и все, я буду придерживаться обходного пути ImhNoAutoUppercase, с ним все не так уж плохо. Я не думаю, что есть способ решить эту проблему без серьезной перекомпиляции самого Qt. Жаль, что в Qt 5.4 есть эта надоедливая функция, которая не позволяет мне ее использовать — locked-when-compiled-with-qt" title="qguiapplication останавливает цикл обработки событий, когда телефон заблокирован при компиляции с помощью qt">stackoverflow.com/questions/27463772/ - person sashoalm; 18.01.2015
comment
Обновлена ​​ссылка на коммит (учитывая, что Qt больше не использует gitorious): code.qt.io/cgit/qt/qtbase.git/commit/ - person David Faure; 02.03.2020
comment
В Qt 5.9 ImhNoAutoUppercase работает так, как задумано, все остается строчными. Все прописные буквы по-прежнему являются странным поведением по умолчанию, но, по крайней мере, настройка работает. - person David Faure; 02.03.2020