您应该连接到进程的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();
}
有什么不好的['waitForFinished'(http://doc.qt.io/qt-5/qprocess.html#waitForFinished)函数或['finished'(HTTP:// DOC .qt.io/qt-5/qprocess.html#finished)完成后立即通知您的信号? –
@JamesAdkison这两个建议不属于同一句话。 'waitForFinished'是一个阻止方法,使UI无响应。这并不意味着要在交互式线程中使用。 –
@KubaOber我不关注你的评论。第一个(在_or_之前)是阻塞函数,第二个(在_or_之后)是使用Qt信号插槽机制的非阻塞解决方案。 –