Cómo bloquear la tecla de retroceso en android cuando se utiliza Qt
Tengo que impedir que la aplicación im hacer salir si alguien empuja la tecla de nuevo en un dispositivo Android para que pueda enviar un mensaje para preguntar si el usuario quiere dejar la aplicación o no, me encontré con:
@Override void MainWindow::onBackPressed() { ... }
Podría manejar ese evento, lo probé en mi proyecto necesitas y no funcionó. ¿Puede qtkeyevent manejar esto? O hay otra manera de hacerlo?
- Utilizar Qt / C ++ para llamar al código Java a través de JNI. FindClass no encuentra clase
- Qt 5.2 y Android Error
- Actividad de Android / Intención vs. Qt Signal / Slot vs. iPhone? /?
- Temporalmente, deshabilitar programaticamente la rotación de pantalla en Qt
- Qt para Android - el equivalente de startActivityForResult no funciona
Lo bloqueo usando esto:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ( (keyCode == KeyEvent.KEYCODE_BACK) ) { //moveTaskToBack(true); return true; } if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, keyCode, event); else return super.onKeyDown(keyCode, event); }
Ahora necesito capturar el evento en Qt para que yo envíe un mensaje
- Qml Cómo usar loader dentro de tabview
- Qt android, la nueva ventana qml no funciona correctamente
- QScroller El desplazamiento cinético no es suave
- Errores de compresión Qt Sensors Qml
- ¿Cómo realizar una llamada con Qt directamente desde la aplicación?
- QSettings no funciona correctamente en Qt bajo Android
- Compilación de la aplicación Qt para Android usando CMake (no por Qt Creator)
- Comparación entre QAbstractButton y QPushButton * carece de un molde
Aquí está cómo solucionarlo:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { int newKeyCode = keyCode; if ( (keyCode == KeyEvent.KEYCODE_BACK) ) { newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; } if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyDown, newKeyCode, event); else return super.onKeyDown(newKeyCode, event); } public boolean super_onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } //--------------------------------------------------------------------------- @Override public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { int newKeyCode = keyCode; if ( (keyCode == KeyEvent.KEYCODE_BACK) ) { newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; } if (QtApplication.m_delegateObject != null && QtApplication.onKeyMultiple != null) return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyMultiple ,newKeyCode, repeatCount, event); else return super.onKeyMultiple(newKeyCode, repeatCount, event); } public boolean super_onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { return super.onKeyMultiple(keyCode, repeatCount, event); } //--------------------------------------------------------------------------- @Override public boolean onKeyUp(int keyCode, KeyEvent event) { int newKeyCode = keyCode; if ( (keyCode == KeyEvent.KEYCODE_BACK) ) { newKeyCode = KeyEvent.KEYCODE_MEDIA_PREVIOUS; } if (QtApplication.m_delegateObject != null && QtApplication.onKeyDown != null) return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onKeyUp, newKeyCode, event); else return super.onKeyUp(newKeyCode, event); } public boolean super_onKeyUp(int keyCode, KeyEvent event) { return super.onKeyUp(keyCode, event); }
Y luego en Qt:
void MainWindow::keyPressEvent(QKeyEvent *k) { if( k->key() == Qt::Key_MediaPrevious ) { int ret = messageBox( QMessageBox::Yes | QMessageBox::No, "¿Desea salir de la aplicación?", QMessageBox::Question); switch(ret) { case QMessageBox::Yes: this->close(); break; case QMessageBox::No: break; } } }
Gracias a Koying que publica esta solución aquí http://groups.google.com/group/android-qt/browse_thread/thread/676c24e94bb9a200?pli=1
Puede escribir onKeyListener para la Actividad, comprobar los códigos de teclado y si son lo que desea, consumirlos . Al menos, en Java. Ciertamente, C ++ no tiene menos posibilidades.
No está muy seguro de si esto se aplica a su situación, pero en Android en general, en cada Activity
de interés que utilizaría lo siguiente para anular la pulsación de botón de nuevo:
@Override public void onBackPressed() { // Make sure to NOT call super! ... }
- ¿Cómo evitar que se inicie la actividad en la primera pestaña de un TabActivity?
- Puede alguien decir cuál es el uso de la actividad de inicio para el resultado en android