пользователь нажимает кнопку Convert (преобразовать), мы копируем имя исходного файла и изменяем его расширение в соответствии с новым форматом файла. Мы используем зависимый от платформы разделитель каталогов ('/' или '\' возвращается функцией QDir::separator) вместо жесткого кодирования этих символов, поскольку пользователь будет видеть имя файла.
Затем отключаем кнопку Convert, чтобы пользователь не мог случайно запустить одновременно несколько процессов преобразования, и очищаем поле текстового редактора, используемое нами для отображения информации о состоянии.
Для инициирования внешнего процесса мы вызываем функцию QProcess::start с именем программы, которая должна выполняться (convert), и всеми ее аргументами. В данном случае мы передаем флажки – enhance и – monochrome, если пользователь выбрал соответствующие опции, и затем имена исходного и целевого файлов. Тип выполняемого преобразования программа convert определяет по расширениям файлов.
При всякой записи внешним процессом в поток cerr вызывается слот updateOutputTextEdit. Мы считываем текст сообщения об ошибке и добавляем его в существующий текст QTextEdit.
04 outputTextEdit->append(tr("Conversion program not found"));
05 convertButton->setEnabled(true);
06 }
07 }
Если процесс не удается запустить, QProcess генерирует сигнал error вместо finished. Мы выдаем сообщение об ошибке и включаем кнопку Convert.
В этом примере преобразования файлов выполнялись асинхронно, т.е. QProcess запускал программу convert и сразу же возвращал управление приложению. Это сохраняет работоспособность пользовательского интерфейса во время выполнения преобразований в фоновом режиме. Но в некоторых ситуациях необходимо, чтобы внешний процесс завершился, и только после этого мы сможем идти дальше в нашем приложении; в таких случаях требуется синхронная работа QProcess.
Одним из распространенных примеров, где желателен синхронный режим работы, является приложение, обеспечивающее редактирование простых текстов с применением текстового редактора, предпочитаемого пользователем. Такое приложение реализуется достаточно просто с помощью QProcess. Например, пусть в QTextEdit содержится простой текст и имеется кнопка Edit, при нажатии на которую выполняется слот edit.
Мы используем QTemporaryFile для создания пустого файла с уникальным именем. Мы не задаем аргументы функции QTemporaryFile::open, поскольку для нас подходит ее режим по умолчанию, по которому файл открывается для чтения и записи. Мы записываем содержимое поля редактирования во временный файл и затем закрываем файл, потому что некоторые текстовые редакторы не могут работать с уже открытыми файлами.