Через некоторое время я нашел решение, на самом деле обходное решение этой проблемы. Идея заключалась в том, чтобы потреблять событие, которое запрашивает панель ввода программного обеспечения (QEvent::RequestSoftwareInputPanel
). Это событие отправляется приложением QML/C++ в систему Android хоста. Итак, я применил фильтр событий SIPRequestEater.
class SIPRequestEater: public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::RequestSoftwareInputPanel)
{
// filter out RequestSoftwareInputPanel event
return true;
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
};
Этот фильтр должен быть установлен QCoreApplication
berfore QCoreApplication::run
называется.
QCoreApplication *coreApp = QCoreApplication::instance();
SIPRequestEater *sipRequestEater = new SIPRequestEater();
coreApp->installEventFilter(sipRequestEater);
Он также может быть установлен на QApllication
.
Проблема в том, что этот фильтр не улавливает QEvent::RequestSoftwareInputPanel
событие. Мое объяснение в том, что фильтры, которые установлены с QCoreApplication::installEventFilter(<filter>)
, являются фильтрами только для входных событий, от Android до приложения QML. QEvent::RequestSoftwareInputPanel
фактически идет в другом направлении, от приложения QML до системы Android. Я не узнал, можно ли фильтровать/отключать выходные события. Из-за этого я решил отфильтровать фокус в событии QEvent::FocusIn
, что фактически вызывает QEvent::RequestSoftwareInputPanel
. Для нашего приложения это работает так, как должно. Клавиатура Android больше не появляется, и наши текстовые поля редактирования по-прежнему фокусируются, потому что у нас есть собственная реализация фокуса и клавиатуры. Я считаю, что это не идеальное решение для всех, поэтому я назвал это обходным путем. Если кто-то знает, как отфильтровать выходные события, особенно QEvent::RequestSoftwareInputPanel
, отправьте его здесь. Окончательное внедрение фильтра:
class SIPRequestEater: public QObject
{
Q_OBJECT
protected:
bool eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::FocusIn)
{
// filter out FocusIn event
return true;
}
else
{
// standard event processing
return QObject::eventFilter(obj, event);
}
}
};
ли делает ваши 'редакторы 'только для чтения опция? Затем вы можете использовать сигналы с вашей пользовательской клавиатуры, чтобы заполнить/изменить текст. – phyatt
@phyatt, извините, я не понял ваш вопрос. Моя проблема заключается в том, когда я нажимаю кнопку редактирования, отображаются программная клавиатура Android и моя клавиатура.Дело в том, что оба работают, но мои собственные просто скрыты под Android. Если я закрою Android один, я могу использовать свой собственный. Таким образом, решение было бы, чтобы отключить Android-клавиатуру по всему миру для всего моего приложения или каким-то образом уловить/отключить сигнал, который запускает открытие клавиатуры Android, если это возможно сделать в классах QtApplication и QtActivity. Но пока я не знаю, как это сделать. – sdomen
http://doc.qt.io/qt-5/qml-qtquick-textedit.html#readOnly-prop Если вы меняете его только на чтение, затем нажимаете на редактирование редактора или строки или что-то, что не следует отправлять сигнал. Другой вариант, о котором вы говорите, это фильтр событий. Через несколько минут я найду ссылку. – phyatt