Связь между процессами

Класс 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)),


<< назад вперед >>