Qt CreatorでGUIからCUIコマンドを実行する

237, 2019-10-31

目次

Qt Creatorでプロセス間通信

コマンドの出力をGUIで利用したい。QProcessを使う。
ラインエディタからフォーカスが外れるとシグナルが送信されるのか勝手に実行される。

Qtで子プロセス


// commandline.h
#ifndef COMMANDLINE_H
#define COMMANDLINE_H

#include <QDialog>
#include <QDebug>
#include <QString>
#include <QProcess>

/* For Japanese */
#define TR(s) (QString::fromLocal8Bit(s))

namespace Ui {
class CommandLine;
}

class CommandLine : public QDialog
{
    Q_OBJECT

public:
    explicit CommandLine(QWidget *parent = 0);
    ~CommandLine();

private:
    void killProcess();

private:
    Ui::CommandLine *ui;
    QProcess *process;

private slots:
    // Command line editor
    void onEndInputCommand();

    // Process
    void onEndProcess();
    void onProcessStdout();
    void onProcessStderr();
};
#endif // COMMANDLINE_H
#include "commandline.h"
#include "ui_commandline.h"

CommandLine::CommandLine(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::CommandLine),
    process(new QProcess(this))
{
    // UI
    ui->setupUi(this);

    // Command line editor
    connect(ui->commandEdit, SIGNAL(editingFinished()), this, SLOT(onEndInputCommand()));

    // Process event
    connect(process, SIGNAL(finished(int)), this, SLOT(onEndProcess()));
    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(onProcessStdout()));
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(onProcessStderr()));
}

CommandLine::~CommandLine()
{
    delete ui;
    delete process;
}

/* Command line editor */

void
CommandLine::onEndInputCommand() {
    QString cmdline = ui->commandEdit->text();

    qDebug() << "command:" << cmdline;

    killProcess();
    process->start(cmdline);
    if (!process->waitForStarted()) {
        qWarning() << process->errorString();
        return;
    }

    ui->commandEdit->setFocus(Qt::OtherFocusReason);
}

/* Process */

void
CommandLine::killProcess()
{
    if (process->state() == QProcess::Running) {
        process->kill();
        if (!process->waitForFinished()) {
            qWarning() << process->errorString();
        }
    }
}

void
CommandLine::onEndProcess() {
    qDebug() << "end process";
}

/**
 * 出力が多いとたまに読みこぼすことがある。遅延処理入れるのもなぁ。
 */
void
CommandLine::onProcessStdout() {
    qDebug() << "process stdout";

    QByteArray arr = process->readAllStandardOutput();
    qDebug() << TR(arr);
}

void
CommandLine::onProcessStderr() {
    qDebug() << "process stderr";

    QByteArray arr = process->readAllStandardError();
    qDebug() << TR(arr);
}

参照

投稿者名です。64字以内で入力してください。

必要な場合はEメールアドレスを入力してください(全体に公開されます)。

投稿する内容です。

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク