2016-11-23 820 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。

+0

第一,您的信號和槽ARGS必須匹配更多的代碼..第二,ReadAllStandardError不會準備好! – HazemGomaa

回答

0

你有兩個選擇

1-等待讀取輸出

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

2-令你process一個成員變量前,從adberror刪除您的第一個參數。所以,

RunProcess

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

然後在adberror

QString str = process->readAllStandardOutput(); 

注意,在你的代碼你有一個問題,因爲你的信號和插槽ARGS不匹配..此外,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

要處理readyReadStandardError()信號應定義插槽:

private slots: 
    void adberror(); 

並使用它:

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

即沒有參數。保持子進程作爲MainWindow類的字段來讀取數據時,它是可用的。

+0

你說的「保持子進程作爲你的主窗口類的字段」呢?我可以添加「QProcess進程」到主窗口前::主窗口...,和它的作品,但我不認爲這是你所建議的是一個全球性的。非常小白,對不起。 – Alan

+0

@Alan要獲得更多關於字段成員和其他C++'class'特性的信息,請閱讀[「類聲明」](http://en.cppreference.com/w/cpp/language/class)規範。最有趣的部分是*會員規格*。 – Nikita