#pragma once #include #include #include #include #include #include #include class PythonRunner : public QObject { Q_OBJECT public: PythonRunner(QTextEdit* outputWidget, QObject* parent = nullptr); ~PythonRunner(); bool runScript(const QString& scriptContent); void stopScript(); private slots: void onOutputAvailable(); void onErrorAvailable(); void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); void onVenvSetupFinished(); void setupVenv(); public slots: void onVenvProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); signals: void scriptFinished(int code); void venvSetupProgress(const QString& message); private: QTextEdit* m_outputWidget; QProcess* m_process; QProcess* m_venvProcess; QTemporaryDir dir; QString venvPath(); QString pythonExePath(); void ensureVenvReady(); bool venvReady; QMutex venvMutex; QWaitCondition venvCondition; };