2016-07-06 19 views
0

私のプロセスが終了したかどうかをチェックしなければならないので、私はそれをboolに変換する必要があります。私はmainwindow.cppでオブジェクト
qprocessが終了したかどうかの確認

QProcess *action; 

を作成しているMainWindow.hで

void MainWindow:: shutdown() 
{ 
action=new QProcess(this); 
action->start("shutdown -s -t 600"); 
//and now I want to use if 
if (action has finished) 
{ 
    QMessageBox msgBox; 
    msgBox.setText("Your computer will shutdown in 1 minute."); 
    msgBox.exec(); 
} 
+2

.qt.io/qt-5/qprocess.html#finished)シグナルが終了したらすぐに通知しますか? –

+0

@JamesAdkison 2つの提案は同じ文章には含まれていません。 'waitForFinished'は、UIを応答不能にするブロッキングメソッドです。これは、インタラクティブなスレッドで使用するためのものではありません。 –

+0

@KubaOber私はあなたのコメントに追随していません。最初の(_or_より前)はブロッキング関数で、2番目の(_or_の後)はQtシグナルスロットメカニズムを使用するノンブロッキングソリューションです。 –

答えて

1

あなたは、プロセスのfinished信号に接続する必要があります。プロセスが終了すると、コードが呼び出されます。例えば。 //ドキュメント:[ `waitForFinished`](http://doc.qt.io/qt-5/qprocess.html#waitForFinished)関数または[` finished`](HTTPと間違って何

// https://github.com/KubaO/stackoverflown/tree/master/questions/process-finished-msg-38232236 
#include <QtWidgets> 

class Window : public QWidget { 
    QVBoxLayout m_layout{this}; 
    QPushButton m_button{tr("Sleep")}; 
    QMessageBox m_box{QMessageBox::Information, 
      tr("Wakey-wakey"), 
      tr("A process is done sleeping."), 
      QMessageBox::Ok, this}; 
    QProcess m_process; 
public: 
    Window() { 
     m_layout.addWidget(&m_button); 
     m_process.setProgram("sleep"); 
     m_process.setArguments({"5"}); 
     connect(&m_button, &QPushButton::clicked, &m_process, [=]{ m_process.start(); }); 
     connect(&m_process, (void(QProcess::*)(int))&QProcess::finished, [=]{ m_box.show(); }); 
    } 
}; 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    Window window; 
    window.show(); 
    return app.exec(); 
} 
+0

私はこれを使用したいとき http://txt.wklej.se/37d7 エラーが発生する 'void QWidget :: show()'の 'this'引数に 'const QMessageBox'を渡すと修飾子が破棄されます[-fpermissive ] –

+0

@MichałUrbanあなたはコードが何を意味するのかを理解する必要があります。コピー&ペーストして偶然に動作することは期待できません。あなたのコードは2つの理由で動作しません:1. 'shutdown'メソッドが返されるとすぐにメッセージボックスが破壊されます。2.ラムダの' QObject'インスタンスを値で取り込むことはできません。答えでは、ラムダがキャプチャしている唯一の変数であるため、値によってキャプチャが 'this'ポインタに適用されます。 'std :: bind(&QMessageBox :: show、m_box)'を使うともっと分かりやすいでしょう。答えに表示されるコードと貼り付けたコードには大きな違いがあります。 –

+0

私は仕上げに添付しますが、何らかの理由でビジー状態を待っている場合は、プロセスの状態を尋ねることもできます。 http://doc.qt.io/qt-5/qprocess.html#state – Andrew

関連する問題