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点相同
    若有什么解决方案可私信我,一起交流学习呀!
相关推荐
止观止11 小时前
C++20 Concepts:让模板错误信息不再“天书”
c++·c++20·编程技巧·模板编程·concepts
('-')11 小时前
《从根上理解MySQL是怎样运行的》第十章学习笔记
笔记·学习·mysql
hd51cc11 小时前
MFC学习笔记 对话框
笔记·学习·mfc
FL162386312912 小时前
ONNX RuntimeC++ 静态库下载安装和使用教程
开发语言·c++
卡提西亚12 小时前
数据库笔记-4-SQL语言之DCL
数据库·笔记·sql
誰能久伴不乏12 小时前
Linux文件套接字AF_UNIX
linux·服务器·c语言·c++·unix
Radan小哥12 小时前
Docker学习笔记—day0010
笔记·学习·docker
im_AMBER12 小时前
Canvas架构手记 05 鼠标事件监听 | 原生事件封装 | ctx 结构化对象
前端·笔记·学习·架构
豆豆plus12 小时前
C++实现文件操作类
开发语言·c++