等待ping命令响应时的QMessage

时间:2012-03-29 07:11:43

标签: c++ qt ping qmessagebox

我正在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新手,也许问题就在其他任何地方。

编辑: 正如@atamanroman建议我尝试使用QProcess,使用信号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永远不会关闭。怎么了?

2 个答案:

答案 0 :(得分:0)

您应该使用QProcess(启动ping.exe和解析输出)或QTcpSocket(自己执行ping操作)而不是system(),因为它们是Qt的一部分并且可以在发出信号时发出信号ping完了。连接到该信号以隐藏QMessageBox

答案 1 :(得分:0)

在你的编辑中: 第一:

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”必须来自类才能在你调用的方法结束后引用它它