例如,当您按“Esc”时,应用程序结束。如何处理Qt控制台应用程序中的按键事件?
回答
Qt不处理控制台事件,它只能从控制台读取\n
终止行。
您需要使用本机API或其他库(curses)。
这是一个针对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);
}
}
然后才开始新的线程来读取键:
ConsoleReader *consoleReader = new ConsoleReader();
connect (consoleReader, SIGNAL (KeyPressed(char)), this, SLOT(OnConsoleKeyPressed(char)));
consoleReader->start();
*更新(添加恢复终端上退出设置)
如果你只需要“退出”也许下面的代码片段将帮助(C + +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;
}
运作良好!你能解释为什么'exec()'后面需要'f.wait()'? – spartawhy117
这是async()线程安全连接的显式同步点。 'f'对象std :: future析构函数可能不会显式阻塞,直到踩到连接(需要探索) – vrogach
- 1. 如何处理在控制台应用程序按键事件
- 2. 如何在wxWidgets控制台应用程序中处理关键事件?
- 3. 如何处理系统按钮Qt的控制台应用程序
- 4. 按钮控制事件处理程序
- 5. Linux控制台键盘处理程序
- 6. 如何处理控制台应用程序中的shutdown \ logoff?
- 7. Qt控制台应用程序教程?
- 8. 非Qt的控制台应用程序
- 9. 如何在JVM控制台应用程序中处理^ C?
- 10. 在控制台应用程序中等待键盘事件
- 11. 如何处理在C中的Linux控制台按下的键?
- 12. 如何将按键发送到控制台应用程序
- 13. 如何在Qt控制台应用程序中使用GetNativeSystemInfo
- 14. 在C++/cli控制台应用程序中处理停止或退出事件
- 15. 在批处理文件我的控制台应用程序
- 16. 如何从Qt应用程序模拟非Qt应用程序中的按键事件
- 17. 使用批处理文件控制台应用程序设置
- 18. 检测控制台应用程序中的按键?
- 19. 在Mac上处理来自控制台应用程序的Apple事件
- 20. Android应用程序中的默认按键事件处理程序
- 21. 如何用QPlainTextEdit处理按键事件
- 22. 控制台中的System.Xml的C#错误处理应用程序
- 23. Qt:事件是否按顺序处理?
- 24. 控制台应用程序中的错误处理
- 25. 控制台应用程序中强大的异常处理
- 26. 在Linux C控制台应用程序中模拟按键
- 27. 在控制台应用程序中运行时按键检测
- 28. JavaScript控制台事件处理
- 29. 如何在控制台中获取按键事件
- 30. 如何使用ATL处理控制台应用程序中的COM事件 - 客户端暂停
感谢您的帮助 –