4

Qtアプリケーション内から生成したc++バイナリを起動したいと思います。これはどのように可能ですか?JavaではのようなものがありRuntime.exec()ました。Qtフレームワークでこれがどのように可能か教えてください。

また、バイナリの実行中に、そのプログラムの出力(現在はコンソールに書き込まれています)をQtのテキストボックスに書き込む必要があります。コンソールに文字列で書き込まれるデータがあれば、textbox.setText()を簡単に実行できます。したがって、基本的に問題は、プログラムが実際にQtフレームワーク内から実行されているときに、プログラムがコンソールに書き込むことになっているデータをどのように入手するかです。

Qt内からコードを実行してコンパイルするだけで、上記の両方の問題を解決できることはわかっていますが、私は厳しい時間の危機といくつかのギャップのある設計の問題の真っ只中にいるので、質問しています。この理由でボートが浮かない場合は、その質問を宿題の質問と考えてください:)

4

2 に答える 2

7

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パラメーターを評価して、すべてが正常かどうかを判断します。

プロセスとすべての潜在的な子プロセスを同意なしに停止/強制終了し、クロスプラットフォームで実行できるようにしたい場合は、楽しくなり始めます...しかし、それは明らかにあなたの質問の範囲外のようです。

于 2013-02-19T23:16:51.957 に答える
4

QProcessとそのメソッド、特にreadAllStandardOutput()を見てください。

于 2013-02-19T15:01:31.497 に答える