QProcessはあなたの友達です。
Windowsコマンドインタープリターを呼び出し、その出力が単純なディレクトリリストを取得するのを同期的に待機する、いくつかのコードの最小バージョンに近いものは、次のようになります。
QProcess process;
process.start("cmd.exe",
QStringList() << "/c" << "dir" << "/b",
QIODevice::ReadWrite | QIODevice::Text);
if(!process.waitForFinished()) // beware the timeout default parameter
qDebug() << "executing program failed with exit code" << process.exitCode();
else
qDebug() << QString(process.readAllStandardOutput()).split('\n');
たとえば、非同期で実行し、Qt-GUIアプリケーション内で「オンライン」の結果を取得してプログレスバーを更新する場合は、さらに興味深いものになります。たとえば、メインフォームコンストラクター内に次の行に沿ってセットアップ部分があります。
process = new QProcess(this);
connect( process, SIGNAL(readyReadStandardOutput()), SLOT(onStdoutAvailable()) );
connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)) );
たぶん、ボタンが押されたハンドラーで、次のようなものを呼び出します。
process->start("some_command", QStringList() << "some" << "args",
QIODevice::ReadWrite | QIODevice::Text);
if(!process->waitForStarted())
// some_command failed to even start
次に、 onStdoutAvailable()スロット内でprocess-> readAllStandardOutput()を呼び出し、それを何らかの方法で解析して進行状況を判断します。最後に、接続されたfinished()シグナルのexitCodeパラメーターとexitStatusパラメーターを評価して、すべてが正常かどうかを判断します。
プロセスとすべての潜在的な子プロセスを同意なしに停止/強制終了し、クロスプラットフォームで実行できるようにしたい場合は、楽しくなり始めます...しかし、それは明らかにあなたの質問の範囲外のようです。