2015-07-07 4 views
2

Я переношу существующее приложение QML/C++ в систему Android. Приложение уже работает на планшете Android, но у меня проблемы с клавиатурой Android. Поскольку мое приложение QML/C++ реализовало свою собственную клавиатуру, я бы хотел отключить Android. Я попытался добавить строку android:windowSoftInputMode="stateAlwaysHidden" в файл AndroidManifest.xml, но клавиатура все еще появляется, когда я нажимаю поле редактирования. Поскольку я переношу существующее приложение, я не хочу редактировать сам код приложения. Единственное, что я могу редактировать, это файлы AndroidManifest.xml, QtApplication.java и QtActivity.java. QtApplication и QtActivity являются производными от Application и Activity классов Android.Отключить клавиатуру Android в приложении qml

Можно ли отключить клавиатуру Android во всем мире для всего приложения при запуске приложения (с редактированием файла манифеста или переопределением onCreate, onStart или аналогичных функций)? Есть ли какие-либо функции в классах Application и Activity, которые я могу переопределить и, следовательно, отключить встроенную клавиатуру?

+1

ли делает ваши 'редакторы 'только для чтения опция? Затем вы можете использовать сигналы с вашей пользовательской клавиатуры, чтобы заполнить/изменить текст. – phyatt

+0

@phyatt, извините, я не понял ваш вопрос. Моя проблема заключается в том, когда я нажимаю кнопку редактирования, отображаются программная клавиатура Android и моя клавиатура.Дело в том, что оба работают, но мои собственные просто скрыты под Android. Если я закрою Android один, я могу использовать свой собственный. Таким образом, решение было бы, чтобы отключить Android-клавиатуру по всему миру для всего моего приложения или каким-то образом уловить/отключить сигнал, который запускает открытие клавиатуры Android, если это возможно сделать в классах QtApplication и QtActivity. Но пока я не знаю, как это сделать. – sdomen

+0

http://doc.qt.io/qt-5/qml-qtquick-textedit.html#readOnly-prop Если вы меняете его только на чтение, затем нажимаете на редактирование редактора или строки или что-то, что не следует отправлять сигнал. Другой вариант, о котором вы говорите, это фильтр событий. Через несколько минут я найду ссылку. – phyatt

ответ

3

Через некоторое время я нашел решение, на самом деле обходное решение этой проблемы. Идея заключалась в том, чтобы потреблять событие, которое запрашивает панель ввода программного обеспечения (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); 
     } 
    } 
}; 
1

QApplication :: setAutoSipEnabled (ложь) отключает программное обеспечение виртуальной клавиатуры от выскакивают автоматически. Вы можете использовать «Q_OS_ANDROID» директивы препроцессора, чтобы избежать изменения поведения на других ваших целевых платформах:

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

#ifdef Q_OS_ANDROID 
    a.setAutoSipEnabled(false); 
#endif 
    (...) 
} 

Вы можете программно отобразить или скрыть виртуальную клавиатуру, используя этот код:

QInputMethod* input; 
input = QGuiApplication::inputMethod(); 

if(input->isVisible()) 
{ 
    input->setVisible(false); 
} 
else 
{ 
    input->setVisible(true); 
} 
Смежные вопросы