Сигнал
01 void ConvertDialog::on_convertButton_clicked()
02 {
03 QString sourceFile = sourceFileEdit->text();
04 targetFile = QFileInfo(sourceFile).path()
05 + QDir::separator() + QFileInfo(sourceFile).baseName()
06 + "." + targetFormatComboBox->currentText().toLower();
07 convertButton->setEnabled(false);
08 outputTextEdit->clear();
09 QStringList args;
10 if (enhanceCheckBox->isChecked())
11 args << "-enhance";
12 if (monochromeCheckBox->isChecked())
13 args << "-monochrome";
14 args << sourceFile << targetFile;
15 process.start("convert", args);
16 }
Когда пользователь нажимает кнопку Convert (преобразовать), мы копируем имя исходного файла и изменяем его расширение в соответствии с новым форматом файла. Мы используем зависимый от платформы разделитель каталогов ('/' или '\' возвращается функцией
Затем отключаем кнопку Convert, чтобы пользователь не мог случайно запустить одновременно несколько процессов преобразования, и очищаем поле текстового редактора, используемое нами для отображения информации о состоянии.
Для инициирования внешнего процесса мы вызываем функцию
01 void ConvertDialog::updateOutputTextEdit()
02 {
03 QByteArray newData = process.readAllStandardError();
04 QString text = outputTextEdit->toPlainText()
05 + QString::fromLocal8Bit(newData);
06 outputTextEdit->setPlainText(text);
07 }
При всякой записи внешним процессом в поток
01 void ConvertDialog::processFinished(int exitCode,
02 QProcess::ExitStatus exitStatus)
03 {
04 if (exitStatus == QProcess::CrashExit) {
05 outputTextEdit->append(tr("Conversion program crashed"));
06 } else if (exitCode != 0) {
07 outputTextEdit->append(tr("Conversion failed"));
08 } else {
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 }
Если процесс не удается запустить,