2016-07-06 3 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

에서 ['waitForFinished'] (http://doc.qt.io/qt-5/qprocess.html#waitForFinished) 함수 또는 ['finished'] (HTTP 문제의 새로운 기능 : // 문서 .qt.io/qt-5/qprocess.html # finished) 완료되면 즉시 알려주는 신호입니까? –

+0

@JamesAdkison 두 가지 제안은 같은 문장에 속하지 않습니다. 'waitForFinished'는 UI를 응답하지 않게 만드는 블로킹 메소드입니다. 그것은 대화식 스레드에서 사용하기위한 것이 아닙니다. –

+0

@KubaOber 나는 당신의 의견을 따르지 않습니다. 첫 번째 (_or_ 이전)는 차단 기능이고 두 번째 (_or_ 후)는 Qt 신호 슬롯 메커니즘을 사용하는 비 차단 솔루션입니다. –

답변

1

당신은 프로세스의 finished 신호에 연결해야합니다. 프로세스가 완료 될 때마다 코드가 호출됩니다. 예 :

// 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 코드가 의미하는 바를 이해해야합니다. 복사하여 붙여 넣기 할 수없고 우연히 작동 할 것으로 기대할 수는 없습니다. 코드는 두 가지 이유로 작동하지 않을 것입니다 : 1.'shutdown' 메쏘드가 리턴하자마자 메시지 상자가 사라질 것입니다. 그리고 2.'QObject' 인스턴스를 람다의 값으로 포착 할 수 없습니다. 그 대답에서, 값에 의한 캡쳐는 람다가 캡쳐하고있는 유일한 변수이기 때문에'this' 포인터에 적용됩니다. 더 확실한 경우'std :: bind (& QMessageBox :: show, m_box)'를 사용할 수 있습니다. 답변과 붙여 넣기에 표시되는 코드에는 중요한 차이점이 있습니다. –

+0

끝까지 붙이겠습니다.하지만 어떤 이유로 든 바쁘게 기다리고 싶다면 프로세스 상태를 물어볼 수도 있습니다. http://doc.qt.io/qt-5/qprocess.html#state – Andrew