First, you need to use QProcess::start() instead of QProcess::execute(): execute() is a static method running the process and blocking until it's done. So the process is already finished when execute() returns. Use start() to run the process without blocking.
Then, in GUI code, you should connect to the finished() and error() signals to learn about both successful termination and errors (check errorString() in case of errors).
If run in the main thread, waitForFinished() blocks the UI, thus it's usually undesirable to use the blocking calls. Note that waitForFinished() returns false not only on timeout, but "if the operation timed out, if an error occurred, or if this QProcess is already finished". Connecting to finished() and error() is a more robust way to detect error cases. If you really want to it in a blocking way (e.g. in a secondary thread or in a non-GUI program), call QProcess::waitForStarted() first, to detect cases where the process couldn't even be started more cleanly.