「Qtの基礎 - プロセス」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「== 概要 == Qtにおいて、<code>QProcess</code>クラスを使用して、プロセスを制御する手順を記載する。<br> <br><br> == サンプルコード =…」) |
|||
34行目: | 34行目: | ||
private slots: | private slots: | ||
// プロセス用のスロット | // プロセス用のスロット | ||
void | void ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); | ||
void | void UpdateOutput(); | ||
void | void UpdateError(); | ||
}; | }; | ||
#endif // MAINWINDOW_H | #endif // MAINWINDOW_H | ||
53行目: | 53行目: | ||
ui->setupUi(this); | ui->setupUi(this); | ||
// | // プロセス用のシグナルとスロットを接続する | ||
QObject::connect(&m_proc, SIGNAL(readyReadStandardOutput()), this, SLOT( | QObject::connect(&m_proc, SIGNAL(readyReadStandardOutput()), this, SLOT(UpdateOutput())); | ||
QObject::connect(&m_proc, SIGNAL(readyReadStandardError()), this, SLOT( | QObject::connect(&m_proc, SIGNAL(readyReadStandardError()), this, SLOT(UpdateError())); | ||
QObject::connect(&m_proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(ProcessFinished(int, QProcess::ExitStatus))); | QObject::connect(&m_proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(ProcessFinished(int, QProcess::ExitStatus))); | ||
} | } | ||
65行目: | 65行目: | ||
// スロット : 標準出力を表示する | // スロット : 標準出力を表示する | ||
void MainWindow:: | void MainWindow::UpdateOutput() | ||
{ | { | ||
// | // 標準出力を取得して文字列にする | ||
QByteArray output = m_proc.readAllStandardOutput(); | QByteArray output = m_proc.readAllStandardOutput(); | ||
QString str = QString::fromLocal8Bit(output); | QString str = QString::fromLocal8Bit(output); | ||
73行目: | 73行目: | ||
// スロット : 標準エラー出力を表示する | // スロット : 標準エラー出力を表示する | ||
void MainWindow:: | void MainWindow::UpdateError() | ||
{ | { | ||
// | // 標準エラー出力を取得して文字列にする | ||
QByteArray output = m_proc.readAllStandardError(); | QByteArray output = m_proc.readAllStandardError(); | ||
QString str = QString::fromLocal8Bit(output); | QString str = QString::fromLocal8Bit(output); |
2021年2月13日 (土) 20:28時点における版
概要
Qtにおいて、QProcess
クラスを使用して、プロセスを制御する手順を記載する。
サンプルコード
プロセスを非同期で実行する場合はQProcess::start()
、同期して実行する場合はQProcess.execute()
を使用する。
また、非同期で実行する場合、標準出力や標準エラー出力を取得してウィンドウに表示することもできる。
以下の例は、プロセスを非同期で実行して、プロセスの標準出力と標準エラー出力をウィンドウに表示している。
// MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QProcess m_proc;
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
// プロセス用のスロット
void ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
void UpdateOutput();
void UpdateError();
};
#endif // MAINWINDOW_H
// MainWindow.cpp
#include <QApplication>
#include <QProcess>
#include "Mainwindow.h"
#include "ui_Mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
// プロセス用のシグナルとスロットを接続する
QObject::connect(&m_proc, SIGNAL(readyReadStandardOutput()), this, SLOT(UpdateOutput()));
QObject::connect(&m_proc, SIGNAL(readyReadStandardError()), this, SLOT(UpdateError()));
QObject::connect(&m_proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(ProcessFinished(int, QProcess::ExitStatus)));
}
MainWindow::~MainWindow()
{
delete ui;
}
// スロット : 標準出力を表示する
void MainWindow::UpdateOutput()
{
// 標準出力を取得して文字列にする
QByteArray output = m_proc.readAllStandardOutput();
QString str = QString::fromLocal8Bit(output);
}
// スロット : 標準エラー出力を表示する
void MainWindow::UpdateError()
{
// 標準エラー出力を取得して文字列にする
QByteArray output = m_proc.readAllStandardError();
QString str = QString::fromLocal8Bit(output);
}
// スロット : プロセス終了時
void MainWindow::ProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
if(exitStatus == QProcess::CrashExit)
{
QMessageBox::warning(this, tr("Error"), tr("Crashed"));
}
else if(exitCode != 0)
{
QMessageBox::warning(this, tr("Error"), tr("Failed"));
}
else
{ // 正常終了時の処理
}
}
// プロセスの起動
void MainWindow::ProcessStart()
{
QStringList strlArgs;
listArgs << "<引数1>" << "<引数2>";
m_proc.start("<実行するプログラムのパス>", listArgs);
}