当前位置:   article > 正文

QT实现终端交互(Windows和Linux通用)_qt terminal

qt terminal

先看下效果,Windows下和Linux下都可以直接交互,输入命令直接回车即可!

注意,Linux下需要先设置正确的密码才可以执行sudo命令!

使用了多线程执行,所以执行命令时界面不卡顿!实时回显!

Linux下:

同一套代码,直接执行即可!

Windows下可执行程序下载:https://autumoon.lanzoux.com/iSe5Rix1cuj

声明代码供参考:

  1. //author:autumoon
  2. //联系QQ:4589968
  3. //日期:2020-11-30
  4. #ifndef TERMINALINTERACTIVE_H
  5. #define TERMINALINTERACTIVE_H
  6. #include <QObject>
  7. #include <QProcess>
  8. #include <QThread>
  9. #include <QMutex>
  10. class TerminalInteractive : public QObject
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit TerminalInteractive(const QString &strPwd, QObject *parent = nullptr);
  15. public:
  16. void Command(const QString& strCmd, const bool& bWaitForFinished = true);
  17. Q_SIGNALS:
  18. void readyReadStandardOutput(const QString& strStandardOutput);
  19. void readyReadStandardError(const QString& strStandardError);
  20. void finished();
  21. private slots:
  22. void on_readoutput();
  23. void on_readerror();
  24. private:
  25. void initialize(const QString& strPwd = "");
  26. private:
  27. QString m_strPwd;
  28. static QMutex m_mutex;
  29. static QProcess *m_pCmd;
  30. };
  31. //启用线程执行
  32. class TerminateWorker : public QObject
  33. {
  34. Q_OBJECT
  35. public slots:
  36. void doWork(const QString& strPwd, const QString& strCmd, const bool& bWaitForFinished)
  37. {
  38. /*耗时操作*/
  39. TerminalInteractive *ti = new TerminalInteractive(strPwd);
  40. connect(ti, SIGNAL(readyReadStandardOutput(const QString&)), this, SIGNAL(readyReadStandardOutput(const QString&)));
  41. connect(ti, SIGNAL(readyReadStandardError(const QString&)), this, SIGNAL(readyReadStandardError(const QString&)));
  42. connect(ti, SIGNAL(finished()), this, SIGNAL(finished()));
  43. ti->Command(strCmd, bWaitForFinished);
  44. }
  45. Q_SIGNALS:
  46. void readyReadStandardOutput(const QString& strStandardOutput);
  47. void readyReadStandardError(const QString& strStandardError);
  48. void finished();
  49. };
  50. class ThreadTerminate : public QObject
  51. {
  52. Q_OBJECT
  53. QThread workerThread;
  54. public:
  55. ThreadTerminate()
  56. {
  57. TerminateWorker *worker = new TerminateWorker;
  58. worker->moveToThread(&workerThread);
  59. connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
  60. connect(worker, SIGNAL(readyReadStandardOutput(const QString&)), this, SIGNAL(readyReadStandardOutput(const QString&)));
  61. connect(worker, SIGNAL(readyReadStandardError(const QString&)), this, SIGNAL(readyReadStandardError(const QString&)));
  62. connect(worker, SIGNAL(finished()), this, SIGNAL(finished()));
  63. connect(this, SIGNAL(start_command(const QString&, const QString&, const bool&)), worker, SLOT(doWork(const QString&, const QString&, const bool&)));
  64. workerThread.start();
  65. }
  66. ~ThreadTerminate()
  67. {
  68. workerThread.quit();
  69. workerThread.wait();
  70. }
  71. public slots:
  72. void Command(const QString& strPwd, const QString& strCmd, const bool& bWaitForFinished)
  73. {
  74. emit start_command(strPwd, strCmd, bWaitForFinished);
  75. }
  76. Q_SIGNALS:
  77. void start_command(const QString& strPwd, const QString& strCmd, const bool& bWaitForFinished);
  78. void readyReadStandardOutput(const QString& strStandardOutput);
  79. void readyReadStandardError(const QString& strStandardError);
  80. void finished();
  81. };
  82. #endif // TERMINALINTERACTIVE_H

欢迎交流与讨论!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42474
推荐阅读
相关标签
  

闽ICP备14008679号