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

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

code review!

一.运行

请添加图片描述

二.main.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点相同
    若有什么解决方案可私信我,一起交流学习呀!
    在这里插入图片描述

相关推荐

  1. Linux C编程实战笔记:线程终止

    2023-12-15 08:08:02       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-15 08:08:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-15 08:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-15 08:08:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-15 08:08:02       20 阅读

热门阅读

  1. React Hooks学习指北

    2023-12-15 08:08:02       34 阅读
  2. 某60内网渗透之利用iodine构建专属dns隧道

    2023-12-15 08:08:02       33 阅读
  3. cfa一级考生复习经验分享系列(二)

    2023-12-15 08:08:02       32 阅读
  4. 在Go中理解栈和先进先出原则

    2023-12-15 08:08:02       40 阅读
  5. 【C语言】clock_gettime函数的使用

    2023-12-15 08:08:02       44 阅读
  6. 盈科数智视频管理平台简介

    2023-12-15 08:08:02       36 阅读
  7. 代码随想录494.目标和

    2023-12-15 08:08:02       29 阅读
  8. 模拟I2C通信

    2023-12-15 08:08:02       38 阅读
  9. npm 和 pip 、cnpm、Yum分别是什么

    2023-12-15 08:08:02       41 阅读