Here is a workaround for linux. Use of these messages
Capturing characters from standard input without waiting for a key press fooobar.com/questions/46788 / ...
I did it like this:
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); } }
And then just run a new thread to read the keys:
ConsoleReader *consoleReader = new ConsoleReader(); connect (consoleReader, SIGNAL (KeyPressed(char)), this, SLOT(OnConsoleKeyPressed(char))); consoleReader->start();
* UPDATED (added restoration of terminal settings upon exit)
source share