2013-06-27 21 views
17

Mam kod, który używa QProcess w ten sposób.odczytać wynik QProcess na ciąg

int main(int argc, char *argv[]) 
{ 
    int status=0; 
    QProcess pingProcess; 
    QString ba; 
    QString exec = "snmpget"; 
    QStringList params; 
    params << "-v" << "2c" << "-c" << "public" << "10.18.32.52" << ".1.3.6.1.4.1.30966.1.2.1.1.1.5.10"; 
    status=pingProcess.execute(exec, params); 
    pingProcess.close(); 
} 

Daje następujące wyniki.

SNMPv2-SMI::enterprises.30966.1.2.1.1.1.5.10 = STRING: "0.1" 

Chcę wziąć (przeczytać) to wyjście jako ciąg. Szukałem tego i nie mogę znaleźć rozwiązania. Z góry dziękuję.

Odpowiedz

24

Próbowałeś QByteArray QProcess::readAllStandardOutput() docs - here

QString może być instancja od QByteArray

QString output(pingProcess.readAllStandardOutput()); 

Jak inni wspomniano, a ja przyłączyć się do nich, nie należy używać execute metody i zastąpić go

pingProcess.start(exec, params); 
pingProcess.waitForFinished(); // sets current thread to sleep and waits for pingProcess end 
QString output(pingProcess.readAllStandardOutput()); 
3

@Shf ma rację, że powinieneś używać readAllStandardOutput. Jednak używasz funkcji execute(), która jest metodą statyczną. Powinieneś wywoływać start() z instancji QProcess.

Warto również poczekać na dane z waitForReadyRead lub po prostu poczekać na zakończenie procesu waitForFinished().

Ponadto, istnieje przeciążony funkcja start, który pozwala przejść całe polecenie, które mogą uczynić Twój kod łatwiejsze do odczytania: -

QProcess pingProcess; 
QString exe = "snmpget -v 2c -c public 10.18.32.52 .1.3.6.1.4.1.30966.1.2.1.1.1.5.10"; 
pingProcess.start(exe); 
pingProcess.waitForFinished(); 
QString output(pingProcess.readAllOutput()); 

Zauważ, że wywołanie waitForFinished zawiśnie bieżący proces, więc jeśli masz zamiar zrobić coś, co zajmie trochę czasu, będziesz chciał dynamicznie utworzyć QProcess i połączyć się z zakończonym() sygnałem, aby podłączony slot mógł odczytać dane.

1

Nie powinieneś używać metody QProcess::execute, jest statyczna i nie zmienia Twojej zmiennej pingProcess. Nie masz dostępu do procesu rozpoczętego za pomocą tej metody. Zamiast tego należy użyć metody start(). Zauważ, że ta metoda jest asynchroniczna. Musisz użyć waitForFinished, a następnie odczytać dane.

pingProcess.start(exec, params); 
pingProcess.waitForFinished(); 
QByteArray output = pingProcess.readAllStandardOutput(); 
1

W bardziej Qt sposób można spróbować użyć sygnału readyReadStandardOutput:

connect(&pingProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readData())); 

i odpowiadające ReadData automatów do łańcucha

QString wyjście = pingProcess.readAllStandardOutput();

+0

Chociaż jest to poprawne, powinieneś wiedzieć, że jeśli proces generuje dużo wydruków, możesz otrzymać kilka wywołań do slotu readData przed zakończeniem procesu, więc musisz obsługiwać konkatenację danych i nadal poczekaj na sygnał zakończenia procesu. – TheDarkKnight

+0

Prawda, connect (& pingProcess, SIGNAL (zakończone (int)), to, SLOT (handleProcessFinish (int); W ten sposób nie blokujesz przepływu (dodatkowo waitFofFinished ma 30 sekund domyślnego limitu czasu) – ariwez

+0

Tak, ale 30 sekund to maksymalny czas oczekiwania, jeśli proces zakończy się wcześniej, to powróci. – TheDarkKnight