0

QProcessがどのように機能するかを学び、この種のコードを作成しようとしています。

#include <iostream>
using std::cout;
using std::endl;

#include <string>
using std::string;

#include <QtCore/QCoreApplication>
#include <QStringList>
#include <QString>
#include <QProcess>
#include <QIODevice>

#define LINE cout << "\n=====================================\n" << endl;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    LINE;
    cout << "\nstarting process ..." << endl;

    QObject *parent;
    QString program = "make";
    QStringList arguments;
    arguments << "all";
    QProcess *process = new QProcess();

    QString outputFile = "H:\\processOutput.txt";
    process->setStandardOutputFile( outputFile, QIODevice::Append);
    process->setWorkingDirectory( "H:\\sample");
    process->start(program, arguments );

    cout << "\ndone..." << endl;
    LINE;

    return a.exec();
} // end main

プロセス「プログラム」は、main.cppとMakefileの2つのファイルがあるフォルダ「H:\sample」で実行する必要があります。

私の期待は、「make」が「all」引数で呼び出されることです。プロセスの出力(ファイル "H:\ processOutput.txt")を調べると、テキスト "main"のみが表示され、コンパイルの出力はありません。

cmdで「makeall」を実行すると動作し、通常の結果、main.exeが生成されます。「done...」という行が表示されるため、コード全体が最後まで実行されているように見えます。私は何が欠けていますか?

4

1 に答える 1

2

QProcessは、その名前が示すように、別のプロセスを開始しますが、コマンドプロンプトと同じように、プロセスは環境マップにバインドされません。

makeプロセスに実行可能ファイルがないためH:\sample、すぐに終了します。代わりに、次のようにcmdの呼び出しをラップします。

...
QString program = "%cmdspec%";
QStringList arguments;
arguments << "\\C" << "\"make all\"";
QProcess *process = new QProcess();
...

%cmdspec%は、コマンドプロンプト実行可能ファイルへのデフォルトのシステムパスを示すグローバル環境変数です。

于 2011-11-02T01:14:52.227 に答える