Как запустить внешнее приложение из программы Qt? - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь запустить внешний exe из моего приложения Qt. Это «приложение автозапуска», и оно имеет три кнопки: одна из них предназначена для запуска внешнего установщика, являющегося приложением .exe.

Я пробовал:

system("Setup.exe")

Работает, но отображается Терминал при запуске установщика. Я также попытался:

QProcess::startDetached("Setup.exe");

, а также попытался:

QProcess *process = new QProcess(this);
process->start("Setup.exe");

, но ни одна из них не работает (ничего не происходит, в выводе консоли также нет журналов). Может кто-нибудь указать мне, что я делаю неправильно или предложить лучшее решение?

Спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

Здесь я пытаюсь проверить все возможные проблемы. Этот код запустит ваш процесс или покажет, почему он не хочет работать.

#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString pathToExecutable = "c:\\Apps\\MyApp\\Setup.exe";

    // Check the path string was written correctly and Qt can see it
    QFileInfo fileInfo(pathToExecutable);

    QProcess process;

    if (fileInfo.exists())
    {
        if(fileInfo.isExecutable())
        {
            QObject::connect(&process, &QProcess::errorOccurred,
                &process, [&]()
            {
                qWarning() << process.errorString();
            });

            /*
            Qt doc:
            To set a working directory, call setWorkingDirectory().
            By default, processes are run in the current
            working directory of the calling process.
            */
            QString executableDir = fileInfo.absolutePath();
            process.setWorkingDirectory(executableDir);

            QString absuluteExecutableFilePath = fileInfo.absoluteFilePath();

            /* 
            Even if QFileInfo see your file, QProcess may not run it,
            if the path contains spaces
            */           
            if (absuluteExecutableFilePath.contains(' '));
            {
                absuluteExecutableFilePath.prepend("\"").append("\"");
            }

            // If you need to check errors, use start(), but not startDetached()
            process.start(absuluteExecutableFilePath);
        }
        else
        {
            qWarning() << "Given file is not executable";
        }
    }
    else
    {
        qWarning() << "File path does not exist or is set incorrectly";
    }

    return a.exec();
}
...