Qt で標準入力(stdin)からデータを読み取る方法
別に難しくなかったんですが、なんかハマったのでメモメモ。
単純な方法
QTextStream を使って以下のように処理をする事が可能です。
#include <QtCore/QDebug>
#include <QtCore/QTextStream>
int main(int argc, char **argv)
{
QTextStream qstdin(stdin);
while(!qstdin.atEnd()) {
QString line = qstdin.readLine();
if (line.isEmpty()) {
break;
} else {
qDebug() << line;
}
}
return 0;
}
高度な方法
イベントループを動かしつつ標準入力から読み込む場合は少し工夫が必要です。
#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QSocketNotifier>
#include <QtCore/QTextStream>
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QTextStream qstdin(stdin);
QSocketNotifier notifier(fileno(stdin), QSocketNotifier::Read);
QObject::connect(¬ifier, &QSocketNotifier::activated, [&]() {
while(!qstdin.atEnd()) {
QString line = qstdin.readLine();
if (line.isEmpty()) {
app.quit();
break;
} else {
qDebug() << line;
}
}
});
return app.exec();
}
ファイルデスクリプタの監視を行うための QSocketNotifier というクラスを使用し、入力があった場合に読み込むようにしています。