我正在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永远不会关闭。怎么了?
答案 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”必须来自类才能在你调用的方法结束后引用它它