• Здесь
  • Где дешевле Заборы из профнастила? Я нашел здесь
  • заборофф72.рф
Жасмин Бланшет

Книги → QT 4: программирование GUI на С++ → Связь между процессами

09 outputTextEdit->append(tr("File %1 created").arg(targetFile));

10 }

11 convertButton->setEnabled(true);

12 }

По окончании процесса мы уведомляем пользователя о результате и включаем кнопку Convert.

01 void ConvertDialog::processError(QProcess::ProcessError error)

02 {

03 if (error == QProcess::FailedToStart) {

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().

01 void ExternalEditor::edit()

02 {

03 QTemporaryFile outFile;

04 if (!outFile.open())

05 return;

06 QString fileName = outFile.fileName();

07 QTextStream out(&outFile);

08 out << textEdit->toPlainText();

09 outFile.close();

10 QProcess::execute(editor, QStringList() << options << fileName);

11 QFile inFile(fileName);

12 if (!inFile.open(QIODevice::ReadOnly))

13 return;

14 QTextStream in(&inFile);

15 textEdit->setPlainText(in.readAll());

16 }

Мы используем QTemporaryFile для создания пустого файла с уникальным именем. Мы не задаем аргументы функции QTemporaryFile::open(), поскольку для нас подходит ее режим по умолчанию, по которому файл открывается для чтения и записи. Мы записываем содержимое поля редактирования во временный файл и затем закрываем файл, потому что некоторые текстовые редакторы не могут работать с уже открытыми файлами.

Статическая функция QProcess::execute() запускает внешний процесс и блокирует работу приложения до завершения процесса. Аргумент editor в строке типа QString содержит имя исполняемого модуля редактора (например, «gvim»). Аргумент options является списком QStringList (который содержит один элемент, «—f», если мы используем gvim).

После закрытия пользователем текстового редактора процесс завершает свою работу и функция execute() возвращает управление. Затем мы открываем временный файл и считываем его содержимое в QTextEdit. QTemporaryFile автоматически удаляет временный файл, когда объект выходит из области видимости.

При синхронной работе QProcess нет необходимости устанавливать соединения сигнал—слот. Если требуется более тонкое управление, чем то, которое обеспечивает статическая функция execute(), мы можем использовать альтернативный подход. Это означает создание объекта QProcess и вызов для него функции start() с последующей установкой блокировки путем вызова функции QProcess::waitForStarted(), после успешного завершения которой вызывается функция QProcess::waitForFinished(). Пример применения этого подхода можно найти в справочной документации по классу QProcess.

← предыдущая следующая →

Страницы раздела: 1 2 3 4

Публикация компанией Dropbox кода Zulip – средства общения для IT-разработчиков

20.11.2015
Одной из одобрительно встреченных программистами инициатив, реализующихся в рамках акции Hack Week, стала публикация исходного кода приложения Zulip – веб-приложения для общения между собой разработчиков в сфере IT-технологий.

Объединение ОС Android и Chrome

17.11.2015
Слухи об объединении двух крупнейших ОС компании Google, Android и Chrome, гуляют по Интернету уже более 5 лет, но до сих пор этого не случилось, хотя очевидно, что с течением времени эти ОС становятся всё более похожими: так, в последнее время появилось немало Android-устройств, к которым прилагаются клавиатуры, а Chrome OS «научилась» работать с сенсорными экранами.

Конференция Linux Piter 2015

15.11.2015
Уже почти через неделю в Санкт-Петербурге впервые в истории пройдёт конференция, посвящённая проблемам свободного программного обеспечения – Linux Piter 2015.