例如,當您按「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#
感謝您的幫助 –