2011-09-25 10 views

उत्तर

5

क्यूटी कंसोल घटनाओं को संभाल नहीं पाता है, यह केवल \n कंसोल से छिद्रित रेखाएं पढ़ सकता है।

आपको देशी एपीआई या अन्य पुस्तकालयों (शाप) का उपयोग करने की आवश्यकता है।

+0

मदद –

5

यहां लिनक्स के लिए एक कामकाज है।

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); 
    } 
} 
: इन पदों

Capture characters from standard input without waiting for enter to be pressed https://stackoverflow.com/a/912796/2699984

मैं इसे इस तरह बनाया है का उपयोग करना

और फिर बस कुंजियां पढ़ने के लिए नया धागा शुरू:

ConsoleReader *consoleReader = new ConsoleReader(); 
connect (consoleReader, SIGNAL (KeyPressed(char)), this, SLOT(OnConsoleKeyPressed(char))); 
consoleReader->start(); 

* अपडेट (जोड़ा बहाल टर्मिनल छोड़ने पर सेटिंग्स)

3

आप केवल 'छोड़' शायद निम्नलिखित स्निपेट में मदद मिलेगी की जरूरत है (ग + +11 और qt5 आवश्यक):

#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; 
} 
+0

मदद के लिए धन्यवाद! क्या आप समझा सकते हैं कि 'exec.)' के बाद 'f.wait()' की आवश्यकता क्यों है? – spartawhy117

+0

यह स्पष्ट सिंक्रनाइज़ेशन बिंदु है जहां async() थ्रेड सुरक्षित रूप से जुड़ता है। 'एफ' ऑब्जेक्ट std :: भविष्य में विनाशक स्पष्ट रूप से तब तक अवरुद्ध नहीं हो सकता जब तक कि ट्रेड जुड़ता है (जिसे अन्वेषण की आवश्यकता होती है) – vrogach

संबंधित मुद्दे