Por ejemplo, cuando presiona "Esc", la aplicación finaliza.¿Cómo se manejan los eventos de pulsación de tecla en una aplicación de la consola Qt?
Respuesta
Qt no maneja los eventos de la consola, solo puede leer \n
líneas terminadas desde la consola.
Necesita utilizar API nativas u otras bibliotecas (curses).
Aquí hay una solución para Linux. El uso de estos mensajes
Capture characters from standard input without waiting for enter to be pressed https://stackoverflow.com/a/912796/2699984
que he hecho de esta manera:
ConsoleReader.h
#ifndef CONSOLEREADER_H
#define CONSOLEREADER_H
#include <QThread>
class ConsoleReader : public QThread
{
Q_OBJECT
signals:
void KeyPressed(char ch);
public:
ConsoleReader();
~ConsoleReader();
void run();
};
#endif /* CONSOLEREADER_H */
ConsoleReader.cpp
#include "ConsoleReader.h"
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
static struct termios oldSettings;
static struct termios newSettings;
/* Initialize new terminal i/o settings */
void initTermios(int echo)
{
tcgetattr(0, &oldSettings); /* grab old terminal i/o settings */
newSettings = oldSettings; /* make new settings same as old settings */
newSettings.c_lflag &= ~ICANON; /* disable buffered i/o */
newSettings.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */
tcsetattr(0, TCSANOW, &newSettings); /* use these new terminal i/o settings now */
}
/* Restore old terminal i/o settings */
void resetTermios(void)
{
tcsetattr(0, TCSANOW, &oldSettings);
}
/* Read 1 character without echo */
char getch(void)
{
return getchar();
}
ConsoleReader::ConsoleReader()
{
initTermios(0);
}
ConsoleReader::~ConsoleReader()
{
resetTermios();
}
void ConsoleReader::run()
{
forever
{
char key = getch();
emit KeyPressed(key);
}
}
Y entonces simplemente comenzar nuevo hilo para leer claves:
ConsoleReader *consoleReader = new ConsoleReader();
connect (consoleReader, SIGNAL (KeyPressed(char)), this, SLOT(OnConsoleKeyPressed(char)));
consoleReader->start();
* actualizado (añadido Restauración de la configuración de terminales en dejar de fumar)
Si sólo necesita 'Salir' tal vez el siguiente fragmento ayudará (c + +11 y qt5 requerido):
#include <iostream>
#include <future>
#include <QCoreApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QCoreApplication application(argc, argv);
bool exitFlag = false;
auto f = std::async(std::launch::async, [&exitFlag]{
std::getchar();
exitFlag = true;
});
QTimer exitTimer;
exitTimer.setInterval(500);
exitTimer.setSingleShot(false);
QObject::connect(&exitTimer,
&QTimer::timeout,
[&application,&exitFlag] {
if (exitFlag)
application.quit();
});
exitTimer.start();
std::cout << "Started! Press Enter to quit...";
int ret = application.exec();
f.wait();
return ret;
}
funciona bien! ¿Podría explicar por qué necesita 'f.wait()' después de 'exec()'? – spartawhy117
Es el punto de sincronización explícito donde el subproceso async() se une de forma segura. El objeto 'f' std :: future destructor no puede bloquear explícitamente hasta que la banda de rodamiento se una (eso necesita exploración) – vrogach
- 1. Cómo manejar evento de pulsación de tecla aplicación de consola
- 2. ¿Recibo eventos de pulsación de tecla y liberación de tecla en aplicaciones de terminal Linux?
- 3. Cómo simular la pulsación de la tecla
- 4. La aplicación no acepta la pulsación de tecla
- 5. Cambio de la pulsación de tecla
- 6. manejo de pulsación de tecla
- 7. ¿Cómo puedo simular la interacción del usuario (evento de pulsación de tecla) en Qt?
- 8. Sondear el teclado (detectar una pulsación de tecla) en python
- 9. Android simular la pulsación de tecla
- 10. ¿Cómo emular/suplantar evento de pulsación de tecla en Haskell?
- 11. tecla de acceso rápido global en la aplicación de consola
- 12. ¿Cómo creo una aplicación simple de la consola Qt en C++?
- 13. Cómo atrapar la doble pulsación de la tecla en javascript?
- 14. Android pulsación de tecla larga
- 15. qDebug Qt aplicación de consola para enviar a la salida de la aplicación Qt Creator
- 16. Qt: ¿Los eventos se procesan en orden?
- 17. Orden de cambio/pulsación de teclas/eventos de pulsación de teclas en jQuery
- 18. Detectar una pulsación de tecla doble en AutoHotkey
- 19. Captura de evento de pulsación de tecla en mi aplicación WPF que no tiene foco
- 20. Detener evento de pulsación de tecla
- 21. Cancelar evento de pulsación de tecla
- 22. Simulación de eventos de pulsación de tecla en Mac OS X
- 23. Entrada de la tecla de flecha C# para una aplicación de consola
- 24. ¿Cómo puedo aceptar la tecla de retroceso en el evento de pulsación de tecla?
- 25. ¿Cómo se manejan los mensajes de los controles creados dinámicamente en una aplicación MFC?
- 26. no se puede disparar el evento de pulsación de tecla cuando presiono la tecla borrar
- 27. Forma de desencadenar varios eventos de pulsación de tecla y retención en jQuery
- 28. ¿Cómo se manejan los pagos sin usarlos en la compra de la aplicación en aplicaciones ios?
- 29. jQuery obtener valor de entrada después de pulsación de tecla
- 30. Método de Python para leer la pulsación de tecla?
gracias por la ayuda –