2016-07-06 4 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: // документ .qt.io/qt-5/qprocess.html # finished), который уведомляет, как только он будет завершен? –

+0

@JamesAdkison Два предложения не относятся к одному предложению. 'waitForFinished' - это метод блокировки, который делает пользовательский интерфейс невосприимчивым. Он не предназначен для использования в интерактивной нити. –

+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' как 'this' аргумент 'void QWidget :: show()' отбрасывает квалификаторы [-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