QProcess

Автор: | 25 июля, 2019

Класс QProcess используется для запуска внешних программ и связи с ними. Чтобы запустить процесс, передайте аргументы name и command line программы, которую запускаете, в качестве аргументов start(). Аргументы предоставляются в виде отдельных строк в QStringList.

Пример использования QProcess

    QString program = "path ";
    QStringList arguments;
    arguments << "";
    QProcess *myProcess = new QProcess(this);
    myProcess->start(program, arguments);

QProcess переходит в состояние «Запуск», и когда программа запускается, QProcess переходит в состояние «Выполнение». QProcess позволяет обрабатывать процесс как устройство последовательного ввода-вывода. Можно писать и читать из процесса так же, как если бы было обращение к сетевому соединению с помощью QTcpSocket. Затем можно записать в стандартный ввод процесса, вызвав write(), и прочитать стандартный вывод, вызвав read(), readLine() и getChar(). Поскольку он наследуется от QIODevice то QProcess можно использовать как источник ввода для QXmlReader или для генерации данных, которые должны быть загружены с использованием QFtp.

Сигнал finish() предоставляет код выхода и статус выхода процесса в качестве аргументов, также можно вызвать exitCode(), чтобы получить код выхода последнего завершенного процесса, и exitStatus(), чтобы получить его статус выхода. Если ошибка возникает в любой момент времени, QProcess выдаст сигнал error(). Можно вызвать error(), чтобы найти тип ошибки, которая произошла последней, и state(), чтобы найти текущее состояние процесса.

Процессы имеют два предопределенных выходных канала:

  • stdout
  • stderr

Стандартный выходной канал (stdout) обеспечивает регулярный вывод на консоль, а стандартный канал ошибок (stderr) обычно выдает ошибки, которые выводятся процессом. Эти каналы представляют собой два отдельных потока данных. Можно переключаться между ними, вызывая setReadChannel(). QProcess высылает сигнал readyRead(), когда данные доступны по текущему каналу чтения. Он также вызывает сигнал readyReadStandardOutput(), когда доступны новые стандартные выходные данные и когда доступны новые стандартные данные об ошибках, вызвав readyReadStandardError(). Вместо вызова read(), readLine() или getChar() можно явно прочитать все данные из любого из двух каналов, вызвав readAllStandardOutput() или readAllStandardError().

Выходные каналы процесса соответствуют каналам чтения QProcess, тогда как входные каналы процесса соответствуют каналам записи QProcess. Это потому, что то, что при чтении с помощью QProcess, является выходом процесса, а то, что пишем, становится входом процесса. QProcess может объединить два выходных канала, так что стандартные выходные данные и данные стандартных ошибок из рабочего процесса используют стандартный выходной канал. Вызвав setProcessChannelMode() с MergedChannels перед запуском процесса, чтобы активировать эту функцию. Также есть возможность пересылать выходные данные запущенного процесса вызывающему основному процессу, передавая в качестве аргумента ForwardedChannels. Определенные процессы требуют специальных настроек среды для работы. Можно установить переменные окружения для процесса, вызвав setEnvironment(). Чтобы установить рабочий каталог, вызовем setWorkingDirectory(). По умолчанию процессы выполняются в текущем рабочем каталоге вызывающего процесса.