Solución:
Entiendo que hay dos desafíos que tendrías:
- Recibir notificaciones sobre cuándo mostrar / ocultar el teclado en pantalla, según el enfoque en los widgets de texto
- Cómo publicar un evento de pulsación de teclas en los widgets de texto
RESPUESTA
- En cuanto al primero, podrías usar
QObject::InstallEventFilter()
en los widgets a los que desea proporcionar el servicio de teclado. A continuación, puede buscar elmouseReleaseEvent
siguiendo las líneas del código Qt en el enlace. - Esto se puede lograr usando
QCoreApplication::postEvent()
Como para QPlatformInputContext
, obtenga el ejemplo de un teclado virtual Qt aquí.
Me tomó bastante tiempo descubrir cómo hacer esto en QT5 sin qml y demasiado trabajo. Así que pensé en compartir:
#include <QCoreApplication>
#include <QGuiApplication>
#include <QKeyEvent>
void MainWindow::on_pushButton_clicked()
{
Qt::Key key = Qt::Key_1;;
QKeyEvent pressEvent = QKeyEvent(QEvent::KeyPress, key, Qt::NoModifier, QKeySequence(key).toString());
QKeyEvent releaseEvent = QKeyEvent(QEvent::KeyRelease, key, Qt::NoModifier);
QCoreApplication::sendEvent(QGuiApplication::focusObject(), &pressEvent);
QCoreApplication::sendEvent(QGuiApplication::focusObject(), &releaseEvent);
}
La pista aquí es que al hacer clic en los botones (si creara manualmente su teclado), se inicia un evento de envío al objeto actual que tiene el foco (por ejemplo, un cuadro de texto). Por supuesto, podría codificar un cuadro de texto, pero eso solo funciona si solo tiene una entrada para usar su teclado.
Lo último de lo que debe asegurarse es establecer la política de enfoque de los botones de su teclado en NoFocus, para evitar que el enfoque cambie cuando se presiona el teclado.
Los créditos van a https://www.wisol.ch/w/articles/2015-07-26-virtual-keyboard-qt/
Espero que esto ayude a alguien.
Un buen ejemplo se da aquí http://tolszak-dev.blogspot.com.tr/2013/04/qplatforminputcontext-and-virtual.html usa Qt Quick para el teclado en pantalla. Usted puede comprobarlo.