第十三课: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/88222855
https://download.csdn.net/download/tanou3212/88222855如果出现中文乱码的问题,请参考我的另外一篇博客《第十课:Qt 字符编码和中文乱码相关问题》 ,百分百能解决你的问题!
相关文章:
第十三课:QtCmd 命令行终端应用程序开发
功能描述:开发一个类似于 Windows 命令行提示符或 Linux 命令行终端的应用程序 一、最终演示效果 QtCmd 不是因为它是 Qt 的组件,而是采用 Qt 开发了一个类似 Windows 命令提示符或者 Linux 命令行终端的应用程序,故取名为 QtCmd。 上述演示…...
Jmeter进阶使用:BeanShell实现接口前置和后置操作
一、背景 我们使用Jmeter做压力测试或者接口测试时,除了最简单的直接对接口发起请求,很多时候需要对接口进行一些前置操作:比如提前生成测试数据,以及一些后置操作:比如提取接口响应内容中的某个字段的值。举个最常用…...
【知识分享】高防服务器的防御机制
【知识分享】高防服务器的防御机制 易受到攻击的网站选择接入高防服务更安全,大家对于这个都清楚!但是对于高防服务如何实现防御来保障安全的,又了解多少呢?今天壹基比小源(贰伍壹叁壹叁壹贰玖捌)就来说说高防服务实现防御的常规…...
内网穿透-外远程连接中的RabbitMQ服务
文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…...
驱动DAY4 字符设备驱动分步注册和ioctl函数点亮LED灯
头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #d…...
Python爬虫——scrapy_当当网图书管道封装
创建爬虫项目 srcapy startproject scrapy_dangdang进入到spider文件里创建爬虫文件(这里爬取的是青春文学,仙侠玄幻分类) srcapy genspider dang http://category.dangdang.com/cp01.01.07.00.00.00.html获取图片、名字和价格 # 所有的se…...
Linux下如何修改CPU 电源工作模式
最近处理一起历史遗留问题,感觉很爽。 现象: 背景:设备采用ARM,即rk3568处理器,采用Linux系统;主要用于视觉后端处理 现象:当软件运行一段时间,大概1个小时(也不是很固定…...
Effective C++学习笔记(8)
目录 条款49:了解new-handler的行为条款50:了解new和delete的合理替换时机条款51:编写new和delete时需固守常规条款52:写了placement new也要写placement delete条款53:不要轻忽编译器的警告条款54:让自己熟…...
学校如何公布录取情况表?这个不用技术的方法,小白老师都能轻松制作
作为一名教师,我深切了解学生和家长们对录取情况的关注和重视。为了满足他们的需求,我们学校一直致力于改进公布录取情况的方式和效果。在本篇文章中,我将向您介绍我们学校独特的录取查询系统,并分享我们选择这种方式的原因。 我…...
Chart GPT免费可用地址共享资源
GPT4.0: https://gpt4e.ninvfeng.xyz github:https://github.com/ninvfeng/chatgpt4 WeUseAi:https://chatb.weuseai.pro AI.LS:https://n7.gpt03.xyz ChatX (iOS/macOS应用):https://itunes.apple.com/app/id6446304087 ch…...
设计模式十八:中介者模式(Mediator Pattern)
在中介者模式中,多个对象之间不再直接相互通信,而是通过一个中介者对象进行通信。这可以减少对象之间的依赖关系,使系统更加模块化。中介者模式适用于当对象之间的通信逻辑变得复杂,导致代码难以维护和理解时。 中介者模式使用场…...
神经网络基础-神经网络补充概念-12-向量化逻辑回归的梯度输出
代码实现 import numpy as npdef sigmoid(z):return 1 / (1 np.exp(-z))def compute_loss(X, y, theta):m len(y)h sigmoid(X.dot(theta))loss (-1/m) * np.sum(y * np.log(h) (1 - y) * np.log(1 - h))return lossdef compute_gradient(X, y, theta):m len(y)h sigmoi…...
2023-08-16力扣每日一题
链接: 2682. 找出转圈游戏输家 题意: 环形1到n,从1开始,每次移动 第i次*k ,当移动到出现过的序号时停下, 求没移动到的数字 解: 简单模拟题,我也以为有数学做法,可…...
耗资170亿美元?三星电子在得克萨斯州建设新的半导体工厂
据报道,三星电子在得克萨斯州泰勒市建设的新的半导体工厂预计将于2024年下半年投入运营。这座工厂将成为三星电子在美国的第二座芯片代工厂,与位于得克萨斯州奥斯汀市的第一座工厂相距不远。 此次投资将耗资约170亿美元,显示了三星电子在半导…...
黑马项目一阶段面试58题 Web14题(一)
一、什么是AJAX 异步的JavaScript和XML。用来做前端和后端的异步请求的技术。 异步请求:只更新部分前端界面的请求,做到局部更新。 比如注册,提示用户名已存在而整个页面没有动 比如百度图片搜索美女,进度条越变越短ÿ…...
多线程与高并发--------线程池
线程池 一、什么是线程池 在开发中,为了提升效率的操作,我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务,可以将任务分成几块,分别交给几个线程去执行,最终做一个汇总就可以了。 比如做业务操…...
深度学习实战48-【未来的专家团队】基于AutoCompany模型的自动化企业概念设计与设想
大家好,我是微学AI,今天给大家介绍一下深度学习实战48-【未来的专家团队】基于AutoCompany模型的自动化企业概念设计与设想,文本将介绍AutoCompany模型的概念设计,涵盖了AI智能公司的各个角色,并结合了GPT-4接口来实现各个角色的功能,设置中央控制器,公司运作过程会生成…...
深入剖析:如何通过API优化云计算架构?快来看!
在当今数字化时代,云计算已经成为企业实现创新、提高效率和降低成本的核心策略之一。而在构建和管理云计算架构时,API(应用程序编程接口)的作用变得愈发重要。本文将深入探讨如何通过API优化云计算架构,实现更高效、灵…...
基于STM32设计的中药分装系统
一、设计需求 基于STM32设计的中药分装系统 【1】项目背景 中药文化是我国文化瑰宝之一,它具有疗效好、副作用小的优点,而且相对于西药,全天然的中药还具有标本兼治的特点,不仅可以用来治病,更可以对患者身体进行调理,所以格外受到当今一直追求生活质量的人们的追捧&quo…...
消息队列学习笔记
消息队列基础 适合消息队列解决的问题 异步处理:处理完关键步骤后直接返回结果,后续放入队列慢慢处理流量控制: 使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。能根据下游的处理能力自动调节流量&#x…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
