QMessage в ожидании ответа команды ping - PullRequest
0 голосов
/ 29 марта 2012

Я выполняю команду ping на IP-адрес и хочу показать в QMessageBox, что происходит операция ping. После этого, если получен ответ или произошел тайм-аут в одну секунду, я хочу закрыть QMessageBox.

Код:

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);
}

Полагаю, мне может понадобиться использовать потоки для этой задачи, но, поскольку я новичок в Qt, возможно, проблема в другом месте.

EDIT: Как подсказал @atamanroman, я пытался использовать QProcess, используя void сигнала QProcess :: finish (int exitCode, QProcess :: ExitStatus exitStatus) [signal], как сказано в ссылке Qt:

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();

И это не работает. myBox никогда не закрывается. Что не так?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2013

В вашем редактировании: Первый:

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;

Мы вынимаем первую &

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

секунду: использование Linux никогда не остановится, тогда вы никогда не получите законченный сигнал,Вы можете предоставить ping некоторые параметры, такие как count или time to wait.Или запустите таймер, чтобы остановить процесс.

третье: вам нужно сопоставить параметры между сигналами и слотами, чтобы избежать предупреждений и т. Д.) ", а затем вы вызываете myBox.Close (), но" myBox "должен быть из класса, чтобы иметь ссылку на него после завершения метода, в котором вы его вызываете.

0 голосов
/ 29 марта 2012

Вы должны использовать QProcess (запустить ping.exe и анализировать вывод) или QTcpSocket (выполнить пинг самостоятельно) вместо system(), потому что они являются частью Qt и могут сигнализировать вам о завершении пинга. Подключитесь к этому сигналу, чтобы скрыть свой QMessageBox.

...