c++ - 如何在 Qt 控制台应用程序中处理按键事件?

标签 c++ qt event-handling keypress

例如,当您按“Esc”时,应用程序结束。

最佳答案

这是 linux 的解决方法。使用这些帖子

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

我是这样设计的:

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);
    }
}

然后启动新线程来读取 key :

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

*已更新(添加了退出时恢复终端设置)

关于c++ - 如何在 Qt 控制台应用程序中处理按键事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7543313/

相关文章:

c++ - solaris 10 gcc 4.8.2 上的 -lpthread 和 -pthreads 有什么区别

macos - 如何完全删除 QLayout 的边距(特定于 Mac OS)

javascript - 当用户单击链接时执行功能的最佳方式是什么?

.net - Windows窗体处理程序在计算机唤醒时被忽略

c++ - Boost dynamic_bitset - 将整数值放入一系列位中

c++ - 一个 C++ 迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

c++ - 无法为简单程序运行 docker 容器

C++ - Qt QObject::connect GET 跨类请求使用

python - PyQt 中继承的困难

image - iTextSharp - 文本重叠图像