2016-11-23 21 views
0

QProcessをエラーハンドラに接続する必要がありますが、エラー文字列をスロットに渡す方法がわかりません。以下はコンパイルされますが、動作しません。QProcess ReadAllStandardError()

QString MainWindow::RunProcess(QString cstring) 
{ 
QProcess *process = new QProcess(this); 
connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror(process::ReadAllStandardError()))) 
process->start(cstring);  
} 



void MainWindow::adberror(QString errtxt) 
{ 
    qDebug() << "error handler"; 
    qDebug() << errtxt; 
} 

私はプロセスエラーを引き起こす可能性がありますが、adberror()は決してトリガーしません。実行すると

は、アプリケーションの出力ペインに私が参照してください。

QObject::connect: No such slot MainWindow::adberror(process::ReadAllStandardError()) 
QObject::connect: (receiver name: 'MainWindow') 

編集:これはQtの5.6です。私は新しいqmake/cleanをやった。

private slots: 
    void adberror(); 

及びそれを使用する:

connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())); 

すなわち引数なしであなたのようにスロットを定義する必要がありreadyReadStandardError()信号を処理する

+0

まず、あなたのシグナルとスロット引数が一致する必要が第二ソリューションのためのより多くのコード..秒ReadAllStandardErrorは準備ができていません! – HazemGomaa

答えて

0

あなたprocessにメンバ変数を作成し、adberrorからあなたの第一引数を削除し、出力に

QString MainWindow::RunProcess(QString cstring) 
{ 
    QProcess process; 
    process.start(cstring); 
    process.waitForFinished(); 
    QString str = process.readAllStandardOutput(); 
} 

2-読み込む前に、2つのオプション

の1-待機を持っています。だから、

その後、RunProcess

connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())) 

あなたのシグナルとスロット引数が一致しないので、あなたのコード内であなたは問題があることをadberror

QString str = process->readAllStandardOutput(); 

ノートで...また、ReadAllStandardErrorでとにかく準備ができていない!

編集:

mainwindow.h

class MainWindow 
{ 
    private://methods 
     void adberror(); 

    private://attributes 
     QProcess* process; 

}; 

mainwindow.cpp

QString MainWindow::RunProcess(QString cstring) 
{ 
    process = new QProcess(this); 
    connect(process,SIGNAL(readyReadStandardError()),this,SLOT(adberror())); 
    connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); 
    process->start(cstring);  
} 

void MainWindow::adberror() 
{ 
    QString str = process->readAllStandardOutput(); 
    qDebug() << str; 
} 
+0

process-> readAllStandardOutput();コンパイルに失敗すると、adberror()はそれが何であるかを知らない。 – Alan

+0

@Alanだから、私の答えでは、MainWindowの**メンバー変数**を処理する必要があると述べた。 – HazemGomaa

+0

ありがとうHG。あなたはそれがどのように行われたのか説明できるなら、私はそれを感謝します。上記のとおり、私は「QProcessプロセス」を追加することができます。 MainWindow :: MainWindowよりも前のmainwindow.cppにあると思いますが、それはうまくいきますが、それはあなたが意味するものだとは思わないでしょう。 – Alan

0

。子プロセスをMainWindowクラスのフィールドとして保持し、データが利用可能になるとそのデータを読み込みます。

+0

「MainWindowクラスのフィールドとして子プロセスを保持する」とはどういう意味ですか?私は "QProcessプロセス"を追加できます。 MainWindow :: MainWindowの前に...、それは動作しますが、私はそれがあなたがグローバルであると示唆しているとは思わないと思います。非常にnoob、申し訳ありません。 – Alan

+0

@Alanフィールドメンバおよびその他のC++ 'class'機能の詳細については、[" Class declaration "](http://en.cppreference.com/w/cpp/language/class)の仕様を参照してください。あなたにとって最も興味深い部分は、* Member specification *です。 – Nikita

関連する問題