您應該連接到進程的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信號插槽機制的非阻塞解決方案。 –