qt-C++笔记之模拟实现一个linux终端窗口

qt-C++笔记之模拟实现一个linux终端窗口

code review!

文章目录

一.运行

二.main.cpp

代码

cpp 复制代码
#include <QApplication>
#include <QPlainTextEdit>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QKeyEvent>
#include <QProcess>
#include <QScrollBar>
#include <QPushButton>

class TerminalWidget : public QWidget
{
    //    Q_OBJECT

public:
    TerminalWidget(QWidget *parent = nullptr)
        : QWidget(parent)
    {
        // 创建终端输出控件
        outputTextEdit = new QPlainTextEdit(this);
        outputTextEdit->setReadOnly(true);
        outputTextEdit->setStyleSheet("background-color: black; color: white;");

        // 创建用户输入控件
        inputLineEdit = new QLineEdit(this);
        inputLineEdit->setStyleSheet("background-color: black; color: white; border: 1px solid white;");

        // 创建清空按钮
        clearButton = new QPushButton("Clear Terminal", this);
        clearButton->setStyleSheet("color: white;"); // 设置按钮上的文本颜色为白色
        connect(clearButton, &QPushButton::clicked, this, &TerminalWidget::clearTerminal);

        // 连接输入控件的信号到槽函数
        connect(inputLineEdit, &QLineEdit::returnPressed, this, &TerminalWidget::processCommand);

        // 创建垂直布局并添加控件
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(outputTextEdit);
        layout->addWidget(inputLineEdit);
        layout->addWidget(clearButton);

        // 设置布局
        setLayout(layout);

        // 设置窗口背景颜色
        setStyleSheet("background-color: black;");

        // 设置窗口标题
        setWindowTitle("Terminal");

        // 设置窗口大小
        resize(800, 600);

        // 设置焦点到输入框
        inputLineEdit->setFocus();
    }

protected:
    void keyPressEvent(QKeyEvent *event) override
    {
        if (event->key() == Qt::Key_Up)
        {
            // 处理上箭头键,浏览历史命令
            if (historyIndex > 0 && historyIndex <= commandHistory.size())
            {
                historyIndex--;
                inputLineEdit->setText(commandHistory.at(historyIndex));
                inputLineEdit->selectAll();
            }
        }
        else if (event->key() == Qt::Key_Down)
        {
            // 处理下箭头键,浏览历史命令
            if (historyIndex >= 0 && historyIndex < commandHistory.size() - 1)
            {
                historyIndex++;
                inputLineEdit->setText(commandHistory.at(historyIndex));
                inputLineEdit->selectAll();
            }
            else if (historyIndex == commandHistory.size() - 1)
            {
                historyIndex = commandHistory.size();
                inputLineEdit->clear();
            }
        }
        else
        {
            QWidget::keyPressEvent(event);
        }
    }

private slots:
    void processCommand()
    {
        // 获取用户输入的命令
        QString command = inputLineEdit->text();

        // 清空输入框
        inputLineEdit->clear();

        // 执行命令并将输出写入终端
        QProcess process;
        process.start(command);
        process.waitForFinished();
        QString output = process.readAll();

        // 添加命令到历史记录
        commandHistory.append(command);
        historyIndex = commandHistory.size();

        // 显示命令和输出
        outputTextEdit->appendPlainText("$ " + command);
        outputTextEdit->appendPlainText(output);

        // 将滚动条滚动到底部,以显示最新的输出
        outputTextEdit->verticalScrollBar()->setValue(outputTextEdit->verticalScrollBar()->maximum());

        // 设置焦点到输入框
        inputLineEdit->setFocus();
    }

    void clearTerminal()
    {
        // 清空输入框和输出窗口
        inputLineEdit->clear();
        outputTextEdit->clear();

        // 设置焦点到输入框
        inputLineEdit->setFocus();
    }

private:
    QPlainTextEdit *outputTextEdit;
    QLineEdit *inputLineEdit;
    QPushButton *clearButton;
    QStringList commandHistory;
    int historyIndex = 0;
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    TerminalWidget terminal;
    terminal.show();

    return app.exec();
}

三.不足,待改进点

  • 1.无法呈现top这种命令的效果
  • 2.无法通过clear这样的命令清空终端显示,只能按钮清空
  • 3.无法呈现ping www.baidu.com这种命令的效果,与第1点相同
    若有什么解决方案可私信我,一起交流学习呀!
相关推荐
汉克老师4 小时前
CSP-J 初赛(以满分为目标):第三十九课《数学与逻辑②——阶乘、排列数与组合数:公式到底从哪里来?》
c++·csp-j·小学生·学c++编程
水饺编程4 小时前
第5章,[Win32 章节] :在平面直角坐标系中描点
c语言·c++·windows·visual studio
linx2954 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6054 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝4 小时前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
心态还需努力呀4 小时前
把 Flameshot 编译进鸿蒙 PC:一次 Qt C++ 截图工具的源码级移植实战
c++·qt·harmonyos
巧克力味的桃子5 小时前
模拟大厂大模型方向面试题
笔记
Peng7115 小时前
浙大数据可视化课程学习笔记
笔记·学习·信息可视化
今儿敲了吗5 小时前
02词云生成器
笔记·python
hanlin035 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode