Ad esempio, quando si preme "Esc", l'applicazione termina.Come gestire gli eventi di pressione del tasto in un'applicazione della console Qt?
risposta
Qt non gestisce gli eventi della console, può solo leggere \n
-le righe terminate dalla console.
È necessario utilizzare API native o altre librerie (curses).
Ecco una soluzione alternativa per linux. L'utilizzo di questi messaggi
Capture characters from standard input without waiting for enter to be pressed https://stackoverflow.com/a/912796/2699984
che ho fatto in questo modo:
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);
}
}
E poi basta iniziare nuovo thread per leggere le chiavi:
ConsoleReader *consoleReader = new ConsoleReader();
connect (consoleReader, SIGNAL (KeyPressed(char)), this, SLOT(OnConsoleKeyPressed(char)));
consoleReader->start();
* aggiornamento (aggiunto il ripristino delle impostazioni del terminale su Quit)
Se è necessario solo 'quit' forse il seguente frammento aiuterà (c + +11 e qt5 richiesti):
#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;
}
funziona bene! potresti spiegare perché hai bisogno di 'f.wait()' dopo 'exec()'? – spartawhy117
È il punto di sinconizzazione esplicito in cui il thread async() si collega in modo sicuro. L'oggetto 'f' std :: future destructor non può bloccare in modo esplicito fino a quando il battistello non si unisce (che richiede l'esplorazione) – vrogach
- 1. Come rilevare la pressione del tasto enter in vaadin TextArea
- 2. Come gestire click lungo e gli eventi del tasto destro in Backbone JS
- 3. Come posso ascoltare gli eventi della console in symfony?
- 4. Come gestire meglio gli eventi
- 5. Come gestire gli eventi della tastiera nelle estensioni della shell di gnome?
- 6. Annulla l'evento di pressione tasto speciale
- 7. Come gestire gli eventi in MVVM
- 8. Come ottenere la posizione del cursore del testo dopo l'evento della pressione di un tasto?
- 9. NDK Android: come gestire la pressione del tasto Indietro in Cocos2dx?
- 10. Emacs eshell. Come leggere il contenuto della riga di comando su pressione del tasto Invio
- 11. Come attivare la pressione di tasto invio
- 12. Rilevamento della pressione di un tasto in Google Maps
- 13. Python - Rileva la pressione del tasto
- 14. Ascolta pressione del tasto per il documento in reactjs
- 15. Come posso simulare una pressione di un tasto in JavaScript?
- 16. come gestire gli eventi del pulsante aggiunti programmaticamente? C#
- 17. Metodo Python per la lettura della pressione di un tasto?
- 18. Qt: gli eventi vengono elaborati in ordine?
- 19. Come ricevere gli eventi di spegnimento in un'applicazione console Symbian?
- 20. Come gestire gli eventi temporali su iOS?
- 21. Come impostare la pressione del tasto su un nastro?
- 22. Come rilevare la pressione del tasto "Invio" nel reagente?
- 23. VB Simula una pressione di tasto
- 24. Utilizzo di KBDLLHOOKSTRUCT per determinare la prima pressione del tasto
- 25. Numero di convalida alla pressione di tasto
- 26. Come attendere la pressione di un tasto in R?
- 27. Come rilevare la pressione di tasto ctrl-t in Delphi
- 28. Come rilevare la pressione di un tasto in Angular 2?
- 29. Come ottenere il valore della pressione di un tasto da un oggetto evento in jQuery
- 30. Monitora tutti gli eventi JavaScript nella console del browser
grazie per l'aiuto –