55 lines
1.9 KiB
C++
55 lines
1.9 KiB
C++
#include "pythonrunner.h"
|
|
#include <QDebug>
|
|
|
|
PythonRunner::PythonRunner(QTextEdit* outputWidget, QObject* parent)
|
|
: QObject(parent), m_outputWidget(outputWidget), m_process(nullptr) {
|
|
m_process = new QProcess(this);
|
|
connect(m_process, &QProcess::readyReadStandardOutput, this, &PythonRunner::onOutputAvailable);
|
|
connect(m_process, &QProcess::readyReadStandardError, this, &PythonRunner::onErrorAvailable);
|
|
connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &PythonRunner::onProcessFinished);
|
|
}
|
|
|
|
PythonRunner::~PythonRunner() {
|
|
if (m_process) {
|
|
m_process->terminate();
|
|
m_process->waitForFinished(1000);
|
|
}
|
|
}
|
|
|
|
void PythonRunner::runScript(const QString& scriptContent) {
|
|
if (m_process->state() == QProcess::Running) {
|
|
m_process->terminate();
|
|
m_process->waitForFinished(1000);
|
|
}
|
|
|
|
m_outputWidget->clear();
|
|
m_process->start("python3", QStringList() << "-u" << "-c" << scriptContent);
|
|
}
|
|
|
|
void PythonRunner::stopScript() {
|
|
if (m_process && m_process->state() == QProcess::Running) {
|
|
m_process->terminate();
|
|
}
|
|
}
|
|
|
|
void PythonRunner::onOutputAvailable() {
|
|
QByteArray output = m_process->readAllStandardOutput();
|
|
m_outputWidget->append(output);
|
|
m_outputWidget->moveCursor(QTextCursor::End);
|
|
}
|
|
|
|
void PythonRunner::onErrorAvailable() {
|
|
QByteArray error = m_process->readAllStandardError();
|
|
m_outputWidget->append(error);
|
|
m_outputWidget->moveCursor(QTextCursor::End);
|
|
}
|
|
|
|
void PythonRunner::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus) {
|
|
if (exitStatus == QProcess::NormalExit && exitCode != 0) {
|
|
m_outputWidget->append(QString("Process exited with code %1\n").arg(exitCode));
|
|
} else if (exitStatus == QProcess::CrashExit) {
|
|
m_outputWidget->append("Python was stopped\n");
|
|
}
|
|
emit scriptFinished(exitCode);
|
|
}
|