Связь между процессами
Класс QP rocess позволяет выполнять внешние программы и взаимодействовать с ними. Этот класс работает асинхронно и в фоновом режиме, из-за чего интерфейс пользователя по-прежнему будет реагировать на действия пользователя. QProcess посылает сигналы, уведомляющие нас о получении данных или о завершении работы.
Мы кратко рассмотрим программный код небольшого приложения, обеспечивающего интерфейс пользователя для внешней программы преобразования изображений. В нашем случае мы используем программу convert из пакета программ Im-ageMagick, который свободно распространяется на всех основных платформах.

Рис. 12.2. Приложение Image Converter
Интерфейс пользователя приложения Image Converter (конвертор изображений) был создан при помощи Qt Designer. Файл .ui находится на компакт-диске, который входит в состав данной книги. Здесь мы основное внимание уделим подклассу, который является наследником сгенерированного компилятором uic класса Ui:: ConvertDialog, и начнем с заголовочного файла:
#ifndef CONVERTDIALOG_H #define CONVERTDIALOG_H
#include <QDialog> #include <QProcess>
#include "ui_convertdialog.h"
class ConvertDialog : public QDialog, public Ui::ConvertDialog
{
Q_0BJECT public:
ConvertDialog(QWidget *parent = 0);
private slots:
void on_browseButton_clicked(); void on_convertButton_clicked(); void updateOutputTextEditO;
void processFinished(int exitCode, QProcess::ExitStatus exitStatus); void processError(QProcess::ProcessError error);
private:
QProcess process; QString targetFile;
};
#endif
Этот заголовочный файл создается по тому знакомому образцу, который используется в подклассах форм Qt Designer. Благодаря механизму автоматического связывания Qt Designerслоты on_browseButton_clicked() и on_convertButton_clicked() автоматически связываются с сигналом clicked() кнопок Browse (просмотреть) и Convert (преобразовать).
ConvertDialog::ConvertDialog(QWidget *parent) : QDialog(parent)
{
setupUi(this);
connect(&process, SIGNAL(readyReadStandardError()),
this, SL0T(updateOutputTextEdit())); connect(&process, SIGNAL(finished(int, QProcess::ExitStatus)),
this, SLOT(processFinished(int, QProcess::ExitStatus))); connect(&process, SIGNAL(error(QProcess::ProcessError)),
<< назад вперед >>