2012-03-29 10 views
0

Ich mache einen Ping an eine IP-Adresse, und ich möchte in einer QMessageBox zeigen, dass eine Ping-Operation läuft. Danach, wenn eine Antwort empfangen wird oder eine Sekunde Zeitüberschreitung auftritt, möchte ich die QMessageBox schließen.QMessage während ich auf eine Antwort des Ping-Befehls warte

Code:

int status; 
QByteArray command; 
QMessageBox myBox(QMessageBox::Information, QString("Info"), QString("Checking connection"), QMessageBox::NoButton, this); 

command.append("ping -w 1 172.22.1.1"); 
status=system(command); 
myBox.setStandardButtons(0); 
myBox.exec(); 
if (0==status){ // Response received 
    // Some stuff here... 
    myeBox.setVisible(false); 
} 
else { // Timeout 
    // Some other stuff here... 
    myBox.setVisible(false); 
} 

Meine Vermutung ist, dass ich Themen für diese Aufgabe verwenden müssen, aber da ich ein Qt-Neuling bin vielleicht das Problem irgendwo anders ist.

EDIT: Als @atamanroman schlug ich habe versucht, QProcess zu verwenden, Signalauslöschung QProcess mit :: fertigen (int exitcode, QProcess :: ExitStatus exitStatus) [Signal], wie in Qt Referenz gesagt:

private: 
QProcess *process; 
//... 

     QMessageBox myBox(QMessageBox::Information, QString("Info"), QString("Checking connection"), QMessageBox::NoButton, this); 
    QObject::connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)), &myBox, SLOT(close())); 
    command.append("ping -w 1 172.22.1.1"); 
    process.start(comdand); 
     myBox.setStandardButtons(0); 
     myBox.exec(); 

Und es funktioniert nicht. myBox ist niemals geschlossen. Was ist los mit dir?

Antwort

0

sollten Sie verwenden QProcess (Start ping.exe und analysieren Ausgang) oder QTcpSocket (tun die Ping-yourself) statt system() weil sie ein Teil von Qt und können Sie signalisieren, wenn der Ping beendet hat. Verbinden Sie sich mit diesem Signal, um Ihre QMessageBox zu verstecken.

+0

Wo sollte das Meldungsfeld (oder, besser, QProgressDialog) ein Klassenmitglied statt lokal auf dem Stapel erstellt werden und in den Schlitzen QProcess :: beendeten() und :: error() verbunden werden. –

+0

Sollte ich mit done() schließen, geerbt von QDialog? –

0

In Ihrem edit: Erstens:

QProcess *process; // This is a pointer, you don't need to add "&" in connect 
        // You should have called "process = new QProcess" before... 
QMessageBox myBox; // This is an object, you need to add the "&" to connect; 

Wir nehmen die erste &

QObject::connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), &myBox, SLOT(close())); 

Sekunde: Linux ping wird nie aufhören, dann werden Sie nie das fertige Signal haben. Sie können einige Parameter wie Anzahl oder Wartezeit angeben. Oder starten Sie einen Timer, um den Prozess zu stoppen.

dritte: Sie müssen die Parameter zwischen den Signalen und Slots passen Warnungen zu vermeiden, usw. ich Sie sugest einen lokalen SCHLITZ „processfinished (int, QProcess :: ExitStatus)“ zu schaffen, und dann rufen Sie myBox. Close(), aber "myBox" muss von der Klasse sein, um auf diese Referenz verweisen zu können, nachdem die Methode, mit der Sie sie aufrufen, beendet wird.