Russian Qt Forum
Апрель 16, 2024, 13:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLineEdit в Android работает иначе  (Прочитано 4514 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Май 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 разумеется всё нормально.
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Май 14, 2019, 16:41 »

Код:
   QKeyEvent ke(QEvent::KeyPress, Qt::Key_Enter, 0,0,0);
    QCoreApplication::sendEvent( ui->lineEdit, &ke );
не помогает.

Код:
    ui->lineEdit->activateWindow();
тоже
« Последнее редактирование: Май 14, 2019, 16:46 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Май 14, 2019, 16:50 »

Ещё заметил - после первой установки курсора в строку и появления клавиатуры набираемый текст подчёркнут. И при этом курсор пальцем не перемещается. Если переместить курсор виртуальными кнопками клавиатуры влево-вправо - клавиатура остаётся, строка попадает в QLineEdit, подчёркивание исчезает, появляется кнопка очистки, дальнейший набор выдаёт textChanged().

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

;:%№%:;№%!!!!!..... Если очистить строку любым способом, в том числе кнопкой очистки на ней самой - она снова перестаёт работать.
« Последнее редактирование: Май 14, 2019, 18:10 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #3 : Май 14, 2019, 18:29 »

А зачем виджеты на ондройде?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Май 14, 2019, 18:33 »

А зачем виджеты на ондройде?

ТАК НАДО!!!
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Май 14, 2019, 18:43 »

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

Кстати, очень похожие описания багов есть и про QML InputText - очевидно для проверки вводимого текста используется тот же код, что и для виджетов. Что вполне логично, поскольку там приличная клюква с проверками допустимости ввода, поддержкой паролей и т.д. Нелогично было бы писать это всё отдельно для QtQuick, если есть проверенное и работающее для виджетов.
« Последнее редактирование: Май 14, 2019, 19:22 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.