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

相关问题