Как убить и перезапустить основной процесс в qt? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть приложение, которое может запускать другие исполняемые файлы. Некоторые кнопки и подключаются к исполняемым файлам. Когда я нажимаю кнопку, запускаю другую программу ... это хорошо, но остается открытым главное окно и программа все еще работает. Я хочу добиться, чтобы главное окно перестало работать (или исчезало), когда запущена другая программа, и когда я выхожу из другого приложения, запускаю (или отображаю и запускаю) основной процесс. Я попробовал это:

void MainWindow::RunSys(QString sh)
{
    this->close();
    QProcess ps;
    if(ps.execute(sh)<0)
    {
        QMessageBox messageBox;
        messageBox.critical(nullptr,"Error",sh + "Error!");
    }
    this->show();
}

//I call the function this way:
QString sh = settings->value("Run").toString();
connect(pButton, &QToolButton::clicked, [=] { RunSys(sh); });

Это работает на Linux. Открывает исполняемую программу, но основная программа работает до Windows. Что я могу сделать?

1 Ответ

0 голосов
/ 24 октября 2019

Я не смог воспроизвести ошибку, нам нужно, чтобы вы предоставили полный, минимальный и воспроизводимый пример, иллюстрирующий ошибку.

Если это может помочь вам, я написал следующий пример кода на основена вашем:

Заголовок

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 является внешней программой, за исключением случаев, когда вы можете прочитать вид сигнала закрытия из внешней программы, вы не сможете определить, когда он закрыт.

...