例如,当您按“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. 如何处理系统按钮Qt的控制台应用程序
- 3. 按钮控制事件处理程序
- 4. Linux控制台键盘处理程序
- 5. Qt控制台应用程序教程?
- 6. 非Qt的控制台应用程序
- 7. 在控制台应用程序中等待键盘事件
- 8. 如何在JVM控制台应用程序中处理^ C?
- 9. 如何处理在C中的Linux控制台按下的键?
- 10. 在C++/cli控制台应用程序中处理停止或退出事件
- 11. 如何从Qt应用程序模拟非Qt应用程序中的按键事件
- 12. 在批处理文件我的控制台应用程序
- 13. Android应用程序中的默认按键事件处理程序
- 14. 如何用QPlainTextEdit处理按键事件
- 15. 在Mac上处理来自控制台应用程序的Apple事件
- 16. Qt:事件是否按顺序处理?
- 17. 控制台中的System.Xml的C#错误处理应用程序
- 18. 控制台应用程序中的错误处理
- 19. 在Linux C控制台应用程序中模拟按键
- 20. 如何在控制台中获取按键事件
- 21. 在控制台应用程序中处理
- 22. qDebug Qt控制台应用程序输出到Qt Creator应用程序输出
- 23. WPF中的Ctrl键按下条件MouseLeftButtonDown事件处理程序
- 24. 如何编写动态控制的事件处理程序?
- 25. 如何从应用程序中删除事件处理程序?
- 26. 如何在Qt中处理所有子窗口小部件的按键事件?
- 27. .NET控制台应用程序中的计划事件?
- 28. 控制台应用程序中的事件接收器
- 29. Java控制台应用程序清理
- 30. 如何检查控制台应用程序中是否按下CTRL键c#
感谢您的帮助 –