2016-11-23 3 views
0

Ich muss einen QProcess mit einem Fehlerhandler verbinden, aber ich bin mir nicht sicher, wie die Fehlerzeichenfolge an den Slot übergeben werden soll. Was folgt, kompiliert, funktioniert aber nicht.QProcess ReadAllStandardError()

Ich kann einen Prozessfehler induzieren, aber adberror() wird nie ausgelöst.

Sobald er ausgeführt wird, im Anwendungsausgabefenster sehe ich:

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

bearbeiten: Das ist Qt 5.6. Ich habe ein neues qmake/clean gemacht.

+0

erste, Ihr Signal und Schlitz args .. passen müssen zweiten , ReadAllStandardError wird sowieso nicht bereit sein! – HazemGomaa

Antwort

0

haben Sie zwei Möglichkeiten

1- warten, bevor der Ausgang

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

2- make Sie process eine Membervariable zu lesen und entfernen Ihr erstes Argument von adberror. So

in RunProcess

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

dann in adberror

QString str = process->readAllStandardOutput(); 

beachten Sie, dass in Ihrem Code Sie ein Problem haben, da Ihr Signal und Schlitz args .. passen nicht auch ReadAllStandardError wird sowieso nicht bereit sein!

Edit: mehr Code für die zweite Lösung

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

Prozess-> readAllStandardOutput(); scheitert beim Kompilieren, adberror() weiß nicht, was es ist. – Alan

+0

@Alan das ist der Grund, warum ich in meiner Antwort erwähnt habe, dass Sie ** eine Member Variable ** von MainWindow – HazemGomaa

+0

machen müssen Danke HG. Ich würde es begrüßen, wenn Sie erklären könnten, wie das gemacht wird.Wie ich oben erwähnt habe, kann ich "QProcess Prozess" hinzufügen; in meinem mainwindow.cpp vor MainWindow :: MainWindow. "und es funktioniert, aber ich glaube nicht, dass Sie das meinen. – Alan

0

die readyReadStandardError() Signal verarbeiten Sie den Schlitz als definieren sollten:

es
private slots: 
    void adberror(); 

und Verwendung:

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

d.h. ohne Argumente. Halten Sie den Kindprozess als ein Feld Ihrer Klasse MainWindow, um Daten zu lesen, wenn sie verfügbar sind.

+0

Was meinen Sie mit "Keep Kind Prozess als ein Feld Ihrer MainWindow-Klasse"? Ich kann "QProcess Prozess" hinzufügen vor MainWindow :: MainWindow ..., und es funktioniert, aber ich denke nicht, dass das, was Sie vorschlagen, ist eine globale. Sehr, nein, tut mir leid. – Alan

+0

@Alan Um weitere Informationen zu Feldmembern und anderen C++ 'class'-Funktionen zu erhalten, lesen Sie die [" Klassendeklaration "] (http://en.cppreference.com/w/cpp/language/class) Spezifikation. Der interessanteste Teil für Sie ist * Mitgliederspezifikation *. – Nikita

Verwandte Themen