How do I read from QProcess?

c++, qprocess, qt

Solution

Use QIODevice::waitForReadyRead() in a loop, and only after that returns, then call `readAllStandardOutput()`. As it says in the docs, `QProcess::readAllStandardOutput()` will read all available data, but will not wait. And before you start reading, you need to wait that process is started with `QProcess::waitForStarted()`.

Quick untested partial code, replace line `ba = ps.readAllStandardOutput();` with this:

if (ps.waitForStarted(-1)) {
    while(ps.waitForReadyRead(-1)) {
        ba += ps.readAllStandardOutput();
    }
}
// else report error or whatever

That should exit the loop when there is error or child process terminates, but keep reading until then, with no timeout.

Note: in a "regular" Qt program, you would have event loop running, and then you would not call `waitForReadyRead()` or other similar convenience functions. They would block the event loop and stop everything else too. In such a program, you would preferably use signals and slots, or alternatively start mucking about with threads (but that's generally not preferred, it just adds unnecessary complexity).

Problem

I have this simple C++ program: ``` int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QProcess ps; QByteArray ba; ps.start("ls J:"); ba = ps.readAllStandardOutput(); char *someData = ba.data(); cout << "Testing QProcess ..." << endl; cout << someData << endl; cout << "done!" << endl; return a.exec(); } ``` The output is: ``` Testing QProcess ... done! ``` If I run "ls J:" from Windows cmd it works. What am I missing?

Original source