#include "pythonrunner.h" #include 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::of(&QProcess::finished), this, &PythonRunner::onProcessFinished); } PythonRunner::~PythonRunner() { if (m_process) { m_process->terminate(); m_process->waitForFinished(1000); } } bool 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); return true; } 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); }