2016-07-06 162 views
0

我必須檢查我的進程是否已完成,並且我需要將其轉換爲bool,因爲如果我想要你。
在MainWindow.h我已經創建了一個對象
檢查qprocess是否已完成

QProcess *action; 

在mainwindow.cpp

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:// DOC .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 我得到一個錯誤 傳遞'const QMessageBox'作爲'void'QWidget :: show()'這個參數'丟棄限定符[-fpermissive ] –

+0

@MichałUrban你需要明白代碼的含義,你不能只是複製粘貼並期望它偶爾工作。你的代碼不會工作,原因有兩個:1.當'shutdown'方法返回時,消息框就會被破壞,並且2.你不能通過lambda中的值捕獲一個'QObject'實例。在答案中,按值捕獲適用於'this'指針,因爲這是lambda捕獲的唯一變量。你可以使用'std :: bind(&QMessageBox :: show,m_box)',如果它對你更明顯。我在答案中顯示的代碼與您的粘貼之間存在重要差異。 –

+0

請注意,我會附加完成,但如果由於某種原因想要忙於等待,您還可以詢問流程的狀態。 http://doc.qt.io/qt-5/qprocess.html#state – Andrew

相關問題