第十三课:QtCmd 命令行终端应用程序开发

这篇具有很好参考价值的文章主要介绍了第十三课:QtCmd 命令行终端应用程序开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能描述:开发一个类似于 Windows 命令行提示符或 Linux 命令行终端的应用程序

一、最终演示效果 

第十三课:QtCmd 命令行终端应用程序开发,Qt 实战经验,Qt,c++,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_WIN
    proc->start("cmd");
#elif Q_OS_LINUX
    proc->start("bash");
#endif

    QTextCursor 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,对应的虚拟键码为:0x01000004
    if(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_WIN
        lastInput =  string.toLocal8Bit() + '\r' + '\n';
#elif Q_OS_LINUX
        lastInput =  string.toLocal8Bit() + '\n';
#endif
        proc->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;
    else
        return 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();
    }
}

完整的代码已经贴上,每个函数的备注写的非常清楚,如有不清楚的地方可以私信我。

如果出现中文乱码的问题,请参考我的另外一篇博客《第十课:Qt 字符编码和中文乱码相关问题》 ,百分百能解决你的问题!文章来源地址https://www.toymoban.com/news/detail-653692.html

到了这里,关于第十三课:QtCmd 命令行终端应用程序开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序(十三)生命周期-更新应用提醒

    注释很详细,直接上代码 上一篇 新增内容: 1. onLaunch 用法 2. onShow 用法 3. onHide 用法 4.应用更新API的调用模板 源码: 效果演示: 模拟成功的情况 2.模拟失败的情况 下一篇

    2024年01月25日
    浏览(52)
  • 二十三种设计模式第十九篇--命令模式

    命令模式是一种行为设计模式, 它将请求封装成一个独立的对象,从而允许您以参数化的方式将客户端代码与具体实现解耦 。在命令模式中, 命令对象充当调用者和接收者之间的中介 。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。 命令模式的核心组成部

    2024年02月14日
    浏览(38)
  • Docker 第十三章 : Docker 三剑客之 Swarm(服务管理命令)

    第十三章 : Docker 三剑客之 Swarm(服务管理命令) 本章知识点: Docker Swarm的服务管理命令是一个功能强大的工具,使用户能够方便地部署、扩展和管理容器化应用程序。 通过Swarm的服务管理命令,用户可以创建、更新、删除和扩展服务。这些命令提供了丰富的选项和参数,

    2024年02月21日
    浏览(34)
  • 100个Python实战项目(十三)使用 Tkinter GUI 库构建闹钟应用程序

    本文主要是使用 Python 的 Tkinter 库创建一个简单的闹钟程序,它可以在指定的时间播放一个声音来提醒你。这个程序界面比较简单,只有一个标签、三个选项菜单和一个按钮,用户可以通过选项菜单设置闹钟的时间,然后点击按钮开始计时,直到闹钟时间到达时,程序会播放

    2023年04月16日
    浏览(45)
  • FinClip 支持创建 H5应用类小程序;PC 终端 优化升级

    FinClip 的使命是使您能够通过小程序解决关键业务流程挑战,并完成数字化转型。不妨让我们看看本月产品与市场发布亮点,是否有助于您实现目标。 FinClip 支持创建 H5应用类小程序 近期我们了解到,诸多开发者/客户自身拥有不少H5应用资源,希望能够物尽其用,让H5应用也

    2024年02月08日
    浏览(35)
  • VlanIf虚拟接口 通信技术(二十三课)

    单臂路由(One-Arm Routing)是一种网络架构设计方式,通常用于部署网络设备(如防火墙、负载均衡器等)实现网络流量控制和安全策略。在单臂路由中,网络设备只有一个物理接口与局域网(LAN)或广域网(WAN)相连。 1.2 交换机 数据链路层 (第二层) 1.3路由器 网络层(第

    2024年02月15日
    浏览(47)
  • 【蓝桥杯Web】第十三届蓝桥杯(Web 应用开发)省赛真题

    第十三届蓝桥杯全国软件和信息技术专业人才大赛(软件类)新开了Web应用开发比赛,本文介绍第十三届蓝桥杯Web应用开发的省赛题目以及解析。 题目描述:使用Flex属性快速完成布局。 题目分析:主要涉及的是Flex弹性布局的知识,主要包括主轴方向和是否换行。 题目代码:

    2023年04月10日
    浏览(51)
  • MAC OS X 这个“安装 macOS Xxx Xxx”应用程序副本已损坏,不能用来安装 macOS,超级终端修改日期date 已解决

    原因 :旧版 macOS 证书已经过期 解决方法 :断开互联网,修改系统时间 说明:10是月,20是日,13是时,14是分,2018是年,20是秒 输入上面的代码按回车后返回的是 Sat Oct 20 13:14:20 PST 2018 就是正确的,否则输入有误。 *日期格式解析:\\\"091400002022\\\"代表2022年9月14日0点发布,所以

    2024年02月12日
    浏览(62)
  • 【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )

    目录 前言 Prime算法--加点法 acwing-858  代码如下 一些解释  Kruskal算法--加边法 acwing-859 并查集与克鲁斯卡尔求最小生成树  代码如下 一些解释   之前学最短路的时候,我们都是以有向图为基础的,当时我们提到如果是无向图,只要记得两个顶点处都要加边就好了。 而在最小

    2024年02月21日
    浏览(44)
  • 学习笔记|ADC|NTC原理|测温程序|STC32G单片机视频开发教程(冲哥)|第十九集:ADC应用之NTC

    NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌等两种或两种以上的金属氧化物进行充分混合、成型、烧结等工艺而成的半导体陶瓷,可制成具有负温度系数(NTC)的热

    2024年02月07日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包