新手学linux分享个刚写的终端模拟器
Tofloor
poster avatar
nohacks
deepin
2020-04-20 04:09
Author
本帖最后由 nohacks 于 2020-4-25 09:59 编辑



部分代码如下:

  1. #include "terminal.h"
  2. #include "ui_terminal.h"
  3. #include
  4. #include
  5. #include
  6. #include
  7. #define T_PrivPtr( o ) (( StationaryLampSet *) o )

  8. Terminal::Terminal(QWidget *parent) :
  9.     QMainWindow(parent),
  10.     ui(new Ui::Terminal)
  11. {
  12.     ui->setupUi(this);

  13.     //注册监视对象
  14.     ui->textEdit->installEventFilter(this);

  15.     //初始化QProcess
  16.     cmd=new QProcess(this);
  17.     connect(cmd , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
  18.     connect(cmd , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));

  19.     //注册启动事件
  20.     QTimer::singleShot(0, this, SLOT(init()));

  21. }

  22. Terminal::~Terminal()
  23. {
  24.    //销毁外部程序
  25.     if(cmd)
  26.     {
  27.           cmd->close();
  28.           cmd->waitForFinished();
  29.     }

  30.     delete ui;

  31. }

  32. void Terminal::init()
  33. {
  34.     cmd->start("bash");            //启动终端(Windows下改为cmd)
  35.     cmd->waitForStarted();        //等待启动完成
  36.     ui->textEdit->append("user@Terminal# ");
  37. }

  38. void Terminal::write(){
  39.     int pos=0;
  40.     QString word= ui->textEdit->toPlainText();
  41.     QRegExp rxlen("user@Terminal#(.+)(\\n|$)");
  42.     rxlen.setMinimal (true) ;
  43.     pos=rxlen.lastIndexIn(word);
  44.    if(pos!=-1){
  45.        QString ch = rxlen.cap(1).trimmed()+"\n";
  46.        char* shell; QByteArray ba = ch.toLatin1(); shell=ba.data();
  47.        cmd->write(shell);
  48.        //Terminal::checkshell();
  49.    }

  50. }

  51. void Terminal::checkshell(){
  52.     QString word= ui->textEdit->toPlainText().trimmed();
  53.     QString w=word.mid(word.length()-1,word.length());
  54.     if(w!="#"){
  55.         ui->textEdit->append("user@Terminal# ");
  56.     }

  57. }

  58. //监视对象
  59. bool Terminal::eventFilter(QObject *target, QEvent *event)
  60. {
  61.      /*处理按键消息 */
  62.     if (target == ui->textEdit && event->type() == QEvent::KeyPress){
  63.             /*强制类型转换 */
  64.             QKeyEvent *keyEvent = static_cast(event);
  65.             if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == 16777220) {
  66.                    Terminal::write();
  67.                     return true;
  68.             }
  69.     }
  70.     /*处理按键消息 */
  71.     return QWidget::eventFilter(target, event);
  72. }

  73. void Terminal::on_readoutput()
  74. {
  75.     ui->textEdit->append(cmd->readAllStandardOutput().data());   //将输出信息读取到编辑框
  76.     Terminal::checkshell();
  77. }

  78. void Terminal::on_readerror()
  79. {
  80.     ui->textEdit->append(cmd->readAllStandardError().data());
  81.     Terminal::checkshell();
  82. }

Copy the Code
请多多指教,看有没有更好的实现方式,目前用的QProcess 组件
发送权限命令,请添加-S 选项
例如:sudo -S fdisk -l

项目地址:https://github.com/xymov/deepin-Terminal
Reply Favorite View the author
All Replies
avatar
走钢丝
deepin
2020-05-11 19:16
#1
支持一下。。
Reply View the author
avatar
lookfor
deepin
2020-05-11 19:39
#2
软件名字应该修改一下
Reply View the author
avatar
ucSec
deepin
2020-05-15 22:22
#3
放码云上?
Reply View the author