1. 实现一个简单的Console(QTextEdit): void RegisterConsole::keyPressEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Return:{ QString text = this->toPlainText(); int ff = text.lastIndexOf(">>"); QString cmd = text.mid(ff+2).trimmed(); parseCMD(cmd); append(tr(">>")); break; }case Qt::Key_Backspace:{ QString text = this->toPlainText(); if(!text.endsWith(">>")) QTextEdit::keyPressEvent(e); break; }case Qt::Key_Period:{ QString text = this->toPlainText(); int flag = text.lastIndexOf(QRegExp("[^a-zA-Z0-9]")); QString parent = text.mid(flag+1).trimmed(); QTextEdit::keyPressEvent(e); break; }default: QTextEdit::keyPressEvent(e); break; } } 2.实现简单的命令处理: void Console::parseCMD(QString cmd) { //预处理 QStringList cmds = cmd.split(" ",QString::SkipEmptyParts); if(cmds.size()==1 && cmds.at(0)=="ls" && !children.isEmpty()){ QString list; for(int i=0; i<children.size(); i++){ list.append(children.at(i).data().toString()+" "); } this->append(list); }else if(cmds.size()==2 && cmds.at(0) == "cd" && !children.isEmpty()){ QString dir = cmds.at(1); if(dir == "//"){ if(!currIndex.parent().isValid()) return; this->currIndex = currIndex.parent(); this->children.clear(); this->updateChildren(currIndex); }else if(dir == "/"){ this->currIndex = model->rootIndex(); this->children.clear(); this->updateChildren(currIndex); }else{ for(int i=0; i<children.size(); i++){ QString child = children.at(i).data().toString(); if(dir.size() == child.size() && dir.contains(child,Qt::CaseInsensitive)){ this->currIndex = children.at(i); this->children.clear(); this->updateChildren(currIndex); break; } } } }else if(cmds.size()==1 && cmds.at(0) == "pwd"){ this->append(this->currIndex.data().toString()); }else if(cmds.size() == 1 && cmds.at(0) == "clear"){ this->clear(); flag = -1; this->moveCursor(QTextCursor::End); }else emit sendCommand(cmd); //非内置命令交给其他组件处理 } 3.