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(&notifier, &QSocketNotifier::activated, [&]() {
        while(!qstdin.atEnd()) {
            QString line = qstdin.readLine();
            if (line.isEmpty()) {
                app.quit();
                break;
            } else {
                qDebug() << line;
            }
        }
    });

    return app.exec();
}

ファイルデスクリプタの監視を行うための QSocketNotifier というクラスを使用し、入力があった場合に読み込むようにしています。