QMessage при ожидании ответа на команду ping

Я делаю эхо-запрос на IP-адрес и хочу показать в QMessageBox, что выполняется операция эхо-запроса. После этого, если будет получен ответ или произойдет таймаут в одну секунду, я хочу закрыть 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, возможно, проблема где-то еще.

РЕДАКТИРОВАТЬ: Как предложил @atamanroman, я пытался использовать QProcess, используя signal void QProcess::finished ( 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 никогда не закрывается. Что случилось?


person Roman Rdgz    schedule 29.03.2012    source источник


Ответы (2)


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

person atamanroman    schedule 29.03.2012
comment
Где окно сообщения (или, лучше, QProgressDialog) должно быть членом класса, а не создаваться локально в стеке и закрываться в слотах, к которым подключены QProcess::finished() и ::error(). - person Frank Osterfeld; 29.03.2012

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

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 никогда не прекратится, тогда у вас никогда не будет готового сигнала. Вы можете предоставить ping некоторые параметры, такие как количество или время ожидания. Или запустите таймер, чтобы остановить процесс.

в-третьих: вам нужно сопоставить параметры между сигналами и слотами, чтобы избежать предупреждений и т. д. Я предлагаю вам создать локальный SLOT "processfinished(int, QProcess::ExitStatus)", а затем вы вызываете myBox.Close(), но " myBox" должен быть из класса, чтобы иметь ссылку на это после завершения метода, в котором вы его вызываете.

person lgarelli_ct    schedule 11.09.2013