Important: Please read the Qt Code of Conduct -

how to write process?

  • Helle,

    I want to start process on qt but it's not working.

    with test.bat working code is:

    "C:\Program Files (x86)\LibreOffice 5\program\soffice" --headless --convert-to pdf --outdir "E:\MessagesToConvert" "E:\MessagesToConvert\odv 16 10 2019.doc"

    I try to use the code below on main.cpp in my qt project but it's not working, no error but nothing happen:

    program= QDir::fromNativeSeparators(C:/Program Files (x86)/LibreOffice 5/program/soffice")+ " --headless --convert-to pdf --outdir " + QDir::fromNativeSeparators("\"E:\MessagesToConvert\"") +" "+QDir::fromNativeSeparators("\"//E:\MessagesToConvert\odv 16 10 2019.doc+"\"");

    What is wrong on this code?

    King regards


  • @filipdns
    One thing that's wrong is it won't compile at it's missing a ), so I don't see how you can have tested it, or you're not pasting your code....

    Another thing is that you are using \ in literal C++ strings (e.g. "E:\MessagesToConvert"), which won't be correct when you need to write \\. And you are missing "s. So the code you show cannot be what you have tried, sigh.... Please use copy & paste if you want help for this sort of code.

    Another thing is that you are using QDir::fromNativeSeparators() into a string where Qt won't be translating them back to native separators, so it will send /s in the OS command, which may not work.

    You don't know what's going wrong with your command ("no error but nothing happen") because you have not hooked up QProcess::errorOccurred, nor have you connected so that you can see any messages sent to stdout or stderr, which you should do, then you might get a message.

    Other than those... :)

    Do yourself a favour and do not try to use the QProcess::start(const QString &command, QIODevice::OpenMode mode = ReadWrite) overload, where you are responsible for building the correctly-quoted line. Instead use QProcess::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite) overload. Here you pass each argument separately in a list, and leave Qt to figuring out the quoting. And don't use QDir::fromNativeSeparators() in the arguments, as Qt won't know to change them to native separators.

    So in the end you'll have something like (I'm not C++, so syntax may be wrong):

    QString program = "C:/Program Files (x86)/LibreOffice 5/program/soffice");       
    QStringList args = "--headless" << 
                       "pdf" <<
                       "--outdir" <<
                       QDir::toNativeSeparators("E:/MessagesToConvert") <<
                       QDir::toNativeSeparators("E:/MessagesToConvert/odv 16 10 2019.doc");
     myProcess.start(program, args);

  • Moderators

    @filipdns said in how to write process?:


    Opening quote is missing before C. Additionally, / is not a native separator on Windows, so fromNativeSeparators() is likely to fail. You don't actually need to convert anything, by the way, Qt handles everything automatically if you just use Unix separator (/).

    You should use QStringList arguments instead of cramming whole invocation into program string.

  • @sierdzio

    Qt handles everything automatically if you just use Unix separator (/).

    Not really. That is true where Qt knows something is a path, e.g. the program parameter to start(). But in the arguments to start()/an OS command it cannot know which might be paths and which might not, so it cannot convert those for you. The arguments need to be passed as you actually want them to come out for the command.

    For example, under Windows in dir /w the w is an option to dir, but in dir \w the \w is a path to dir. You must be careful about how you pass things, e.g. here toNativeSeparators() when you mean the option, or passing /w as an argument where you mean it as a path to convert, would go wrong.... My example code (should hopefully!) indicate the correct requirements for the OP's command.

  •         Thank you very much for your help, below the working code:
                    QString program = "C:/Affichage/Display/LibreOffice 5/program/soffice" ;
                    QStringList args;
                    myProcess.start(program, args);

  • @filipdns
    OK, and that's good, but for anyone else reading this the point about the file paths means that the "correct"/"at least preferable" way would pass those argument paths as:


Log in to reply