功能描述:開發一個類似于 Windows 命令行提示符或 Linux 命令行終端的應用程序
?一、最終演示效果?
QtCmd 不是因為它是 Qt 的組件,而是采用 Qt 開發了一個類似 Windows 命令提示符或者 Linux 命令行終端的應用程序,故取名為 QtCmd。
上述演示是在 Win10 操作系統下,模擬命令提示符的功能,輸入錯誤的指令(如 windows 下輸入 ls 指令),錯誤輸出的字體顏色為紅色;輸入正確的指令(如 windows 下輸入dir 指令),標準輸出的字體顏色顯示正常。
本應用程序原為一個項目的子功能,實現命令行終端的界面,現把這一功能單獨封裝了一個窗體類,分享給大家參考,可以直接集成到你的應用程序中。
具體功能使用就不多說了,和命令行終端的功能一模一樣,只是說把這一功能集成到自己的應用程序中了,命令行終端支持的指令,本終端全部支持。
二、命令行終端程序開發
命令行終端程序主要在 terminalwidget.h 和 terminalwidget.cpp 中封裝了?TerminalWidget 類,實現了有關命令輸入和信息輸出的所有功能。
terminalwidget.h 文件代碼如下:
#ifndef TERMINALWIDGET_H
#define TERMINALWIDGET_H#include <QTextEdit>
#include <QKeyEvent>
#include <QFont>
#include <QProcess>
#include <QByteArray>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTextLayout>
#include <QTextCursor>
#include <QTextBlock>
#include <QTextCodec>
#include <assert.h>class TerminalWidget: public QTextEdit
{Q_OBJECT
public:TerminalWidget();protected:void keyPressEvent(QKeyEvent *e);private:// 字體QFont font;// 命令行終端進程QProcess * proc;// 光標位置long long lastPosition = 0;// 上一次的輸入內容QByteArray lastInput;public slots:/*** @brief readyReadStandardOutputSlot 標準輸出*/void readyReadStandardOutputSlot();/*** @brief readyReadStandardErrorSlot 錯誤輸出*/void readyReadStandardErrorSlot();
};#endif // TERMINALWIDGET_H
terminalwidget.cpp?文件代碼如下:
#include "terminalwidget.h"
#include <QDebug>TerminalWidget::TerminalWidget()
{setStyleSheet("background-color:rgb(0,0,0); color:rgb(255,255,255); border:0px;");setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);resize(1000,700);setWindowTitle("命令行提示符");font.setFamily("Times New Roman");font.setPixelSize(14);setFont(font);proc = new QProcess();connect(proc,SIGNAL(readyReadStandardOutput()),this,SLOT(readyReadStandardOutputSlot()));connect(proc,SIGNAL(readyReadStandardError()),this,SLOT(readyReadStandardErrorSlot()));#ifdef Q_OS_WINproc->start("cmd");
#elif Q_OS_LINUXproc->start("bash");
#endifQTextCursor editCursor = textCursor();QTextBlockFormat textBlockFormat;textBlockFormat.setLineHeight(20, QTextBlockFormat::FixedHeight);editCursor.setBlockFormat(textBlockFormat);setTextCursor(editCursor);
}void TerminalWidget::keyPressEvent(QKeyEvent *e)
{QTextCursor editCursor = textCursor();// Qt::Key_Enter 是小鍵盤(數字鍵盤)的 Enter,對應的虛擬鍵碼為:0x01000005// Qt::Key_Return 是大鍵盤區的 Enter,對應的虛擬鍵碼為:0x01000004if(e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter){e->ignore();editCursor.setPosition(lastPosition, QTextCursor::MoveAnchor);editCursor.movePosition(QTextCursor::End, QTextCursor::KeepAnchor);QString string = editCursor.selectedText();editCursor.clearSelection();
#ifdef Q_OS_WINlastInput = string.toLocal8Bit() + '\r' + '\n';
#elif Q_OS_LINUXlastInput = string.toLocal8Bit() + '\n';
#endifproc->write(lastInput);return;}else if(e->key() == Qt::Key_Backspace && editCursor.position() <= lastPosition)return;else if(e->key() == Qt::Key_Delete && editCursor.position() <= lastPosition)return;elsereturn QTextEdit::keyPressEvent(e);
}void TerminalWidget::readyReadStandardOutputSlot()
{QByteArray ba = proc->readAllStandardOutput();QTextCodec * textCodec = QTextCodec::codecForName("System");// assert 斷言,如果 textCodec 為空,則編譯報錯assert(textCodec != nullptr);QString output = textCodec->toUnicode(ba);if (output.length() > 0 && output != QString::fromLocal8Bit(lastInput)){setTextColor(Qt::white);append(output.trimmed());moveCursor(QTextCursor::End);lastPosition = textCursor().position();}
}void TerminalWidget::readyReadStandardErrorSlot()
{QByteArray ba = proc->readAllStandardError();QTextCodec* textCodec = QTextCodec::codecForName("System");// assert 斷言,如果 textCodec 為空,則編譯報錯assert(textCodec != nullptr);QString output = textCodec->toUnicode(ba);if (output.length() > 0 && output != QString::fromLocal8Bit(lastInput)){setTextColor(Qt::red);append(output.trimmed());moveCursor(QTextCursor::End);lastPosition = textCursor().position();}
}
完整的代碼已經貼上,每個函數的備注寫的非常清楚,如有不清楚的地方可以私信我。
完整代碼壓縮包下載地址:?
https://download.csdn.net/download/tanou3212/88222855https://download.csdn.net/download/tanou3212/88222855如果出現中文亂碼的問題,請參考我的另外一篇博客《第十課:Qt 字符編碼和中文亂碼相關問題》 ,百分百能解決你的問題!