Я не смог воспроизвести ошибку, нам нужно, чтобы вы предоставили полный, минимальный и воспроизводимый пример, иллюстрирующий ошибку.
Если это может помочь вам, я написал следующий пример кода на основена вашем:
Заголовок
class MainWindow : public QMainWindow
{
Q_OBJECT
protected:
QPushButton * pb;
public:
MainWindow();
void runShellCmd(const QString & cmd);
};
Реализация
MainWindow::MainWindow()
{
// Build the main window
resize(600, 400);
pb = new QPushButton("run cmd", this);
this->setCentralWidget(pb);
// Create the command
QString cmd("ping 127.0.0.1 -n 6");
// Connect the signal
connect(pb, &QPushButton::clicked, [=](){runShellCmd(cmd);});
}
void MainWindow::runShellCmd(const QString & cmd)
{
QProcess ps;
this->close();
int exit_code = ps.execute(cmd);
switch(exit_code)
{
// Do what you want with exit code
default:;
}
this->show();
}
Основная функция
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}
И все работало нормально.
РЕДАКТИРОВАТЬ:
Я понял, что не так. Ваш пример с calc.exe шепнул мне проблему:)
На самом деле, QProcess::execute()
блокирует, пока не вернется командный вызов. В этом случае он возвращается сразу после запуска, а не когда окна закрыты. Итак, вы получили ожидаемое поведение.
Боюсь, что так будет намного сложнее сделать это. Поскольку calc.exe является внешней программой, за исключением случаев, когда вы можете прочитать вид сигнала закрытия из внешней программы, вы не сможете определить, когда он закрыт.