Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Май 14, 2019, 16:07



Название: QLineEdit в Android работает иначе
Отправлено: Гурман от Май 14, 2019, 16:07
Одно и то же приложение собрано в Linux и Android. Есть строка ввода QLineEdit. В Linux работает как положено - устанавливаешь мышкой курсор, начинаешь вводить, появляется кнопка-символ очистки строки (разрешён в настройках), полетели сигналы textChanged(). В Android не так. Когда устанавливаешь курсор тапом в строку, появляется виртуальная клавиатура, но при вводе нет ни сигналов textChanged(), ни кнопки очистки строки. Нормально работает placeholderText - он появляется когда строка пустая, исчезает когда что-то в неё есть. Текст редактируется полностью но без сигнала textChanged(). Пока не нажмёшь Enter - тогда виртуальная клавиатура исчезает, появляется кнопка очистки и вылетает сигнал textChanged(). Если теперь снова тапнуть в строку, клавиатура появится, кнопка не исчезнет, набор текста и другое редактирование будут выдавать сигнал textChanged() - то есть, будет работать как должно. Судя по всему это баг, вызванный собственной буферизацией текста Android. Может быть помогло бы сделать сбоку commit редакторе, но пока не ясно как это сделать. Как побороть, не понятно.
Код:
    ui->lineEdit->setFocus();
    ui->lineEdit->clearFocus();
Не помогают.

Ну и, заодно ещё ui->lineEdit->setText( text ) не эмитирует textChanged(text) то есть, совсем. Хотя может быть, если после setText() послать Enter или сделать commit - то сработает. Пока не пробовал. В Linux разумеется всё нормально.


Название: Re: QLineEdit в Android работает иначе
Отправлено: Гурман от Май 14, 2019, 16:41
Код:
    QKeyEvent ke(QEvent::KeyPress, Qt::Key_Enter, 0,0,0);
    QCoreApplication::sendEvent( ui->lineEdit, &ke );
не помогает.

Код:
    ui->lineEdit->activateWindow();
тоже


Название: Re: QLineEdit в Android работает иначе
Отправлено: Гурман от Май 14, 2019, 16:50
Ещё заметил - после первой установки курсора в строку и появления клавиатуры набираемый текст подчёркнут. И при этом курсор пальцем не перемещается. Если переместить курсор виртуальными кнопками клавиатуры влево-вправо - клавиатура остаётся, строка попадает в QLineEdit, подчёркивание исчезает, появляется кнопка очистки, дальнейший набор выдаёт textChanged().

Ага... Глюк вылазит если передать в начале пустую строку. Если передать не пустую, то всё работает нормально. В Linux такого нет, там и с пустой строкой в начале нормально работает. Пойду оформлять баг-репорт...

;:%№%:;№%!!!!!..... Если очистить строку любым способом, в том числе кнопкой очистки на ней самой - она снова перестаёт работать.


Название: Re: QLineEdit в Android работает иначе
Отправлено: Авварон от Май 14, 2019, 18:29
А зачем виджеты на ондройде?


Название: Re: QLineEdit в Android работает иначе
Отправлено: Гурман от Май 14, 2019, 18:33
А зачем виджеты на ондройде?

ТАК НАДО!!!


Название: Re: QLineEdit в Android работает иначе
Отправлено: Гурман от Май 14, 2019, 18:43
О! Исследовав багрепорты нашёл совершенно неочевидный хак, но практически лечащий этот баг - надо вызвать
Код:
    ui->lineEdit->setInputMethodHints(Qt::ImhNoPredictiveText);
Строка начинает работать после ввода первого символа. Правда при программном setText("") сигнал textChanged("") всё равно не выдаётся - очевидно если строка была пустая, она не изменилась. Но мне надо ловить все случаи когда в строку что-то приходит. Это уже решается простым способом - если в setText("") строка пустая, то сразу передаётся setText(" "), и clear(). А в обработчике сигнала textChanged(" ") один пробел игнорируется с немедленным возвратом. На clear() будет выдан повторный textChanged(""), который я считаю соответствующим setText(""). В большинстве случаев схляет.

Кстати, очень похожие описания багов есть и про QML InputText - очевидно для проверки вводимого текста используется тот же код, что и для виджетов. Что вполне логично, поскольку там приличная клюква с проверками допустимости ввода, поддержкой паролей и т.д. Нелогично было бы писать это всё отдельно для QtQuick, если есть проверенное и работающее для виджетов.