第十三課:QtCmd 命令行終端應用程序開發

功能描述:開發一個類似于 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/88222855icon-default.png?t=N6B9https://download.csdn.net/download/tanou3212/88222855如果出現中文亂碼的問題,請參考我的另外一篇博客《第十課:Qt 字符編碼和中文亂碼相關問題》 ,百分百能解決你的問題!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FreeMarker系列--list的用法(長度,遍歷,下標,嵌套,排序)

原文網址&#xff1a;FreeMarker系列--list的用法&#xff08;長度,遍歷,下標,嵌套,排序&#xff09;_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹FreeMarker的list的用法。 大小 Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?s…

W5500-EVB-PICO 做UDP Server進行數據回環測試(七)

前言 前面我們用W5500-EVB-PICO 開發板在TCP Client和TCP Server模式下&#xff0c;分別進行數據回環測試&#xff0c;本章我們將用開發板在UDP Server模式下進行數據回環測試。 UDP是什么&#xff1f;什么是UDP Server&#xff1f;能干什么&#xff1f; UDP (User Dataqram P…

圖數據庫_Neo4j學習cypher語言_使用CQL命令002_刪除節點_刪除屬性_結果排序Order By---Neo4j圖數據庫工作筆記0006

然后我們再來看如何刪除節點 可以看到首先 我們這里 比如我要刪除張三 可以看到 match (n:student) where n.name = "張三" delete n 這樣就是刪除了student集合中,name是張三的節點 然后我們再來看 如何來刪除關系 match (n:student)-[r]->(m:student) where…

機器學習、cv、nlp的一些前置知識

為節省篇幅&#xff0c;不標注文章來源和文章的問題場景。大部分是我的通俗理解。 文章目錄 向量關于向量的偏導數&#xff1a;雅可比矩陣二階導數矩陣&#xff1a;海森矩陣隨機變量隨機場伽馬函數beta分布數學術語坐標上升法協方差訓練集&#xff0c;驗證集&#xff0c;測試集…

Nginx的安裝及負載均衡搭建

一.Nginx的安裝 1&#xff09;準備安裝環境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一個Perl庫&#xff0c;包括 perl 兼容的正則表達式庫。 nginx的http模塊使用pcre來解…

前端jd要求:了解一門后端開發語言優先 解決方案之Node.js

前端jd要求&#xff1a;了解一門后端開發語言優先 解決方案之Node.js 前言常見的后端開發語言一、什么是 Node.js二、學習 Node.js 的前置知識三、學習 Node.js 的步驟1、Node.js 的安裝2、Node.js 的基本語法和 API模塊導入和導出文件讀寫操作HTTP 服務器命令行參數 3、Node.j…

可能導致不可接受的信息安全事件發生的核電站事故。

立陶宛伊格納利納核電站&#xff08;1992 年&#xff09; 一名在該核電站工作的程序員將惡意代碼上傳到一個負責反應堆子系統運行的自動化系統中&#xff0c;該系統被及時發現。 但如果沒有及時發現&#xff0c;誰知道會發生什么呢&#xff1f;核電站被關閉以進行調查。有關這…

Vue-8.集成(.editorconfig、.eslintrc.js、.prettierrc)

介紹 同時使用 .editorconfig、.prettierrc 和 .eslintrc.js 是很常見的做法&#xff0c;因為它們可以在不同層面上幫助確保代碼的格式一致性和質量。這種組合可以在開發過程中提供全面的代碼維護和質量保證。然而&#xff0c;這也可能增加一些復雜性&#xff0c;需要謹慎配置…

Coreutils工具包,Windows下使用Linux命令

之前總結過兩篇有關【如何在Windows系統下使用Linux的常用命令】的文章&#xff1a; GnuWin32&#xff0c;Windows下使用Linux命令 UnxUtils工具包&#xff0c;Windows下使用Linux命令 今天再推薦一個類似的工具包Coreutils 一、簡介 GNU core utilities是GNU操作系統基本…

【HDFS】hdfs的count命令的參數詳解

Usage: hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths

(學習筆記-進程管理)怎么避免死鎖?

死鎖的概念 在多線程編程中&#xff0c;我們為了防止多線程競爭共享資源而導致數據錯亂&#xff0c;都會在操作共享資源之前加上互斥鎖&#xff0c;只有成功獲得到鎖的線程&#xff0c;才能操作共享資源&#xff0c;獲取不到鎖的線程就只能等待&#xff0c;直到鎖被釋放。 那…

創建一個簡單的HTML Viewer應用程序

使用wxPython和內嵌瀏覽器來創建一個簡單的HTML Viewer應用程序。 在本篇文章中&#xff0c;我們將使用Python和wxPython模塊來創建一個簡單的HTML Viewer應用程序。這個應用程序可以讓用戶輸入HTML內容&#xff0c;并在內嵌瀏覽器中顯示該內容的效果。 準備工作 在開始之前…

apache doris和StarRocks的區別

記錄一下最新要用到2個新數據庫的區別 Apache Doris是一個分布式的列式存儲系統&#xff0c;它的設計目標是提供大規模數據處理的可靠性和高性能。Doris采用了集群方式&#xff0c;通過將數據分布在多個機器上進行處理來提高性能&#xff0c;并提供了SQL查詢接口方便用戶使用。…

QT:定時器事件

定時器第一種辦法&#xff1a; 1.利用事件timerEvent&#xff0c;在幫助文檔中找到該字段&#xff1a;[override virtual protected] void QTimer::timerEvent(QTimerEvent *e) 重寫該虛函數 //重寫定時器事件void timerEvent(QTimerEvent *e);2.啟動定時器startTimer(1000); …

區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測

區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測 目錄 區間預測 | MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測效果一覽基本介紹模型描述程序設計參考資料 效果一覽 基本介紹 MATLAB實現QRGRU門控循環單元分位數回歸時間序列區間預測。基于分位…

卷積神經網絡教程 (CNN) – 使用 TensorFlow 在 Python 中開發圖像分類器

在這篇博客中,讓我們討論什么是卷積神經網絡 (CNN) 以及 卷積神經網絡背后的架構——旨在解決 圖像識別系統和分類問題。 卷積神經網絡在圖像和視頻識別、推薦系統和自然語言處理方面有著廣泛的應用。 目錄 計算機如何讀取圖像? 為什么不是全連接網絡?

[GitOps]微服務版本控制:使用ArgoCD 部署Grafana Loki

背景介紹 請回答&#xff1a;你們是如何保證線上部署的服務&#xff0c;從服務版本到參數配置&#xff0c;都是和測試通過的版本是一致的呢&#xff1f; 本文將介紹GitOps的基本原理以及ArgoCD的使用&#xff1a;ArgoCD部署Grafana Loki 到k8s集群。 本文項目地址&#xff1…

詳細介紹如何使用 OpenCV 對圖像進行銳化

將了解銳化圖像的過程,我們將使用內核來突出顯示每個特定像素并增強其發出的顏色。它與模糊過程非常相似,只不過現在我們不是創建一個內核來平均每個像素強度,而是創建一個內核,該內核將使像素強度更高,因此對人眼來說更加突出。 了解流程的后端。 很高興知道內核用于模糊…

Nginx 解決api跨域問題

環境: nginx 1.22.1 寶塔8.0 php lavarel 在nginx里加入下面的設置 #這里填*就是任何域名都允許跨域add_header Access-Control-Allow-Origin "*";#CORS請求默認不發送Cookie和HTTP認證信息。但是如果要把Cookie發到服務器&#xff0c;要服務器同意&#xff0c…

Webpack和Parcel詳解

構建工具和打包器是在開發過程中幫助組織、優化和打包項目的工具。它們可以處理依賴管理、資源優化、代碼轉換等任務&#xff0c;從而使開發流程更高效。以下是關于構建工具和打包器的一些指導&#xff1a; **Webpack&#xff1a;** Webpack 是一個功能強大的模塊打包器&#…