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 というクラスを使用し、入力があった場合に読み込むようにしています。