Как запустить консольное приложение в отдельном окне из Qt 5.15

    При разработке на Qt 5.15 новички часто сталкиваются с проблемой: по нажатию кнопки нужно запустить внешнее консольное приложение (например, cmd.exe или diskpart.exe) в отдельном окне. Простой вызов QProcess::startDetached() не всегда работает - приложение либо не запускается, либо открывается не то окно. Разберём причину и дадим стабильное решение.

    Почему QProcess::startDetached() работает нестабильно

    Метод QProcess::startDetached() создаёт новый процесс, но не управляет его окном. Для консольных приложений (например, cmd.exe) требуется явно указать аргументы командной строки. Если передать только имя программы без аргументов, процесс может завершиться сразу или не показать окно. Кроме того, некоторые системные утилиты (вроде explorer.exe) ведут себя по-разному в зависимости от пути - из System32 они могут не открываться, а из SysWOW64 работают.

    Рабочий код для запуска cmd.exe в отдельном окне

    Вот проверенный пример для Qt 5.15, который открывает окно cmd.exe (или другую консольную программу) по нажатию кнопки:

    void MainWindow::on_pushButton_clicked()
    {
        QProcess process;
        QString program = "cmd.exe";
        QStringList arguments;
        arguments << "/K" << "echo Hello, World!";
        process.startDetached(program, arguments);
    }

    Ключевой момент - аргумент /K для cmd.exe (оставляет окно открытым после выполнения команды). Для других приложений укажите их параметры командной строки.

    Как запустить любое консольное приложение (diskpart, ping и др.)

    Если нужно запустить, например, diskpart.exe, используйте полный путь и пустой список аргументов:

    void MainWindow::on_pushButton_clicked()
    {
        QProcess process;
        QString program = "c:\\Windows\\System32\\diskpart.exe";
        QStringList arguments;
        process.startDetached(program, arguments);
    }

    Обратите внимание: путь записывается с двойными обратными слешами. Если приложение не запускается, проверьте права доступа и наличие файла. Для explorer.exe используйте путь из C:\Windows\SysWOW64\explorer.exe.

    Типичные ошибки и их решение

    • Приложение запускается, но окно не видно - добавьте аргумент /K для cmd.exe или /WAIT для других утилит.
    • Процесс завершается сразу - убедитесь, что программа существует по указанному пути, и передайте правильные аргументы.
    • Из System32 не запускается explorer.exe - используйте путь из C:\Windows\SysWOW64\explorer.exe.
    • Код не компилируется - добавьте #include <QProcess> в начало файла.

    Заключение

    Для стабильного запуска консольных приложений в Qt 5.15 всегда передавайте аргументы командной строки, даже если они пустые. Используйте полный путь к исполняемому файлу и проверяйте, откуда запускается системная утилита. Если проблема остаётся, обратитесь к официальной документации Qt или на форум qt.io.

    Часто задаваемые вопросы