2012-03-29 18 views
0

IPアドレスに対してpingを実行していますが、ping操作が進行中であることをQMessageBoxに表示したいとします。その後、応答が受信された場合や1秒のタイムアウトが発生した場合は、QMessageBoxを閉じます。QMessageがpingコマンドの応答を待っています

コード:

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を使用して、QProcessを使用しようとしました::完成示唆したように(int型EXITCODE、QProcess ::終了ステータス終了ステータス)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

彼らはQtのの一部であり、pingが完了したときに信号を送ることができるので、あなたの代わりにsystem()QProcess(PING.EXEを開始し、出力を解析)またはQTcpSocketを(ピングを自分で行う)を使用する必要があります。その信号に接続してQMessageBoxを非表示にします。あなたの編集で

+0

メッセージボックス(または、より良いQProgressDialog)は、スタックにローカルに作成されず、QProcess :: finished()および:: error()スロットに閉じられる代わりに、クラスメンバーでなければなりません。 –

+0

QDialogから継承したdone()で閉じるべきですか? –

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に渡すことができます。または、プロセスを停止するタイマーを開始します。

第三は: あなたは私はあなたがローカル「processfinished(int型、QProcess ::終了ステータス)」SLOTを作成するためにsugest、その後、あなたがmyBoxに呼び出すなど を警告を回避するためにシグナルとスロット間のパラメータと一致する必要があります。 Close()、しかし、 "myBox"は、あなたがそれを呼び出すメソッドを終了した後、これを参照するためにはクラスからでなければなりません。

関連する問題