Саммерфилд Марк
Шрифт:
Затем отключаем кнопку Convert, чтобы пользователь не мог случайно запустить одновременно несколько процессов преобразования, и очищаем поле текстового редактора, используемое нами для отображения информации о состоянии.
Для инициирования внешнего процесса мы вызываем функцию QProcess::start с именем программы, которая должна выполняться (convert), и всеми ее аргументами. В данном случае мы передаем флажки – enhance и – monochrome, если пользователь выбрал соответствующие опции, и затем имена исходного и целевого файлов. Тип выполняемого преобразования программа convert определяет по расширениям файлов.
При всякой записи внешним процессом в поток cerr вызывается слот updateOutputTextEdit. Мы считываем текст сообщения об ошибке и добавляем его в существующий текст QTextEdit.
По окончании процесса мы уведомляем пользователя о результате и включаем кнопку Convert.
Если процесс не удается запустить, QProcess генерирует сигнал error вместо finished. Мы выдаем сообщение об ошибке и включаем кнопку Convert.
В этом примере преобразования файлов выполнялись асинхронно, т.е. QProcess запускал программу convert и сразу же возвращал управление приложению. Это сохраняет работоспособность пользовательского интерфейса во время выполнения преобразований в фоновом режиме. Но в некоторых ситуациях необходимо, чтобы внешний процесс завершился, и только после этого мы сможем идти дальше в нашем приложении; в таких случаях требуется синхронная работа QProcess.
Одним из распространенных примеров, где желателен синхронный режим работы, является приложение, обеспечивающее редактирование простых текстов с применением текстового редактора, предпочитаемого пользователем. Такое приложение реализуется достаточно просто с помощью QProcess. Например, пусть в QTextEdit содержится простой текст и имеется кнопка Edit, при нажатии на которую выполняется слот edit.
Мы используем QTemporaryFile для создания пустого файла с уникальным именем. Мы не задаем аргументы функции QTemporaryFile::open, поскольку для нас подходит ее режим по умолчанию, по которому файл открывается для чтения и записи. Мы записываем содержимое поля редактирования во временный файл и затем закрываем файл, потому что некоторые текстовые редакторы не могут работать с уже открытыми файлами.