проблема с пробелами QProcess и аргументами - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу вызвать исполняемый файл через QProcess.Путь к исполняемому файлу может содержать пробелы.Поэтому я помещаю цитаты по пути к исполняемому файлу.

Однако это работает только до тех пор, пока я не добавлю никаких аргументов.

Следующий код воспроизводит проблему:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>
#include <QDir>

int main(int argc, char *argv[])
{
    int i = 0; // no whitespace, no argument -> works
    //    int i = 1; // whitespace with quotation, no arguments -> works
    //    int i = 2; // no whitespace, arguments -> works
    //    int i = 3; // whitespace with quotation, arguments -> works not

    QCoreApplication a(argc, argv);

    QProcess *process = new QProcess();

    QString pathToFile;
    QString absolutePathToProgram;
    pathToFile = "/home/user/tmp/file.xml";

    if (i == 0){
        absolutePathToProgram = "/home/user/tmp/executable";
    }else if(i == 1){
        absolutePathToProgram = "/home/user/tmp whitespace/executable";
        absolutePathToProgram = "\"" + absolutePathToProgram + "\"";
    }else if(i == 2){
        absolutePathToProgram = "/home/user/tmp/executable";
    }else if(i == 3){
        absolutePathToProgram = "/home/user/tmp whitespace/executable";
        absolutePathToProgram = "\"" + absolutePathToProgram + "\"";
    }

    QStringList arguments;
    arguments << pathToFile;

    if (i==0 || i==1){
        process->start(absolutePathToProgram);
    }else{
        process->start(absolutePathToProgram,arguments);
    }

    process->waitForFinished();

    QString output(process->readAllStandardOutput());

    qDebug() << output;

    return a.exec();
}

Я добавил 4 случая:

  • i == 0: путь к исполняемому файлу не содержит пробелов, и мыне передавайте аргументы.Это работает
  • i == 1: путь к исполняемому файлу содержит пробелы, и мы не передаем аргументы.Это работает
  • i == 2: путь к исполняемому файлу не содержит пробелов, и мы передаем аргументы.Это работает
  • i == 3: путь к исполняемому файлу содержит пробелы, и мы передаем аргументы.Это не работает

Почему не работает case i == 3?

Я использую Ubuntu в качестве операционной системы.

БОНУС:

Мне также нужно, чтобы он работал на Windows.Обычно в Windows я запускаю программу с:

process->start("cmd.exe", QStringList() << "/c" << absolutePathToProgram << pathToFile);

У меня не было времени протестировать его в Windows, но если кто-то отправляет ответ, а также знает, как создать решение для Windows, сообщитея знаю.

1 Ответ

0 голосов
/ 28 ноября 2018

Могут быть статические методы:

QDir::homePath()
QDir::toNativeSeparator(...) 

может помочь вам (в том числе и для перекрестной переносимости)

Например,

const QString absolutePathToProgram = QDir::toNativeSeparators(QString("%1/QtExamples/tmp dir/my app").arg(QDir::homePath()));
...