Process.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <QGuiApplication>
  2. #include <QDebug>
  3. #include "Process.h"
  4. Process::Process(QObject *parent) : QProcess(parent)
  5. {
  6. setProcessChannelMode(QProcess::MergedChannels);
  7. connect(this, &QProcess::readyRead, this, &Process::onReadyRead);
  8. connect(this, &QProcess::stateChanged, this, &Process::onStateChanged);
  9. connect(this, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this, &Process::onFinished);
  10. }
  11. Process::~Process()
  12. {
  13. if (state() != NotRunning) {
  14. terminate();
  15. }
  16. }
  17. void Process::start(const QString &program, const QVariantList &arguments)
  18. {
  19. QStringList args;
  20. for (int i = 0; i < arguments.length(); i++) {
  21. args << arguments[i].toString();
  22. }
  23. qDebug() << "starting: " << program << args.join(" ");
  24. QProcess::start(program, args);
  25. }
  26. QString Process::applicationDirPath()
  27. {
  28. return QGuiApplication::applicationDirPath();
  29. }
  30. bool Process::isRunning()
  31. {
  32. return state() != NotRunning;
  33. }
  34. void Process::onReadyRead()
  35. {
  36. const QString &text = QString(readAll());
  37. qDebug() << text;
  38. outputRead(text);
  39. }
  40. void Process::onFinished(int code, QProcess::ExitStatus /*status*/)
  41. {
  42. finished(code);
  43. }
  44. void Process::onStateChanged(QProcess::ProcessState state)
  45. {
  46. bool running = state == QProcess::Running;
  47. if (running != wasRunning) {
  48. wasRunning = running;
  49. emit isRunningChanged(running);
  50. }
  51. }