ctai/src/ctai_cmd.cpp

55 lines
1.8 KiB
C++
Raw Normal View History

2025-02-23 20:45:42 +08:00
#include "ctai_cmd.h"
ctai_cmd::ctai_cmd()
{
QVBoxLayout *layout = new QVBoxLayout(this);
textEdit = new QPlainTextEdit(this);
2025-02-24 17:47:32 +08:00
textEdit->setReadOnly(true); // 允许编辑,以便模拟命令行输入输出环境
2025-02-23 20:45:42 +08:00
layout->addWidget(textEdit);
QLineEdit *lineEdit = new QLineEdit(this);
layout->addWidget(lineEdit);
layout->setStretch(0, 8);
layout->setStretch(1, 2);
connect(lineEdit, &QLineEdit::returnPressed, this, [this, lineEdit]()
{
slots_executeCommand(lineEdit->text());
lineEdit->clear(); // 清空输入框
});
process = new QProcess(this);
process->setProcessChannelMode(QProcess::MergedChannels); // 合并输出通道
connect(process, &QProcess::readyRead, this, &ctai_cmd::slots_readProcessOutput);
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[](int code, QProcess::ExitStatus status){
QMessageBox::warning(nullptr, "Process",
QString("进程异常退出,代码:%1").arg(code));
});
// 启动Shell
#ifdef Q_OS_WIN
process->start("cmd.exe");
#else
process->start("/bin/bash");
#endif
}
ctai_cmd::~ctai_cmd()
{
}
void ctai_cmd::slots_readProcessOutput() {
// 实时读取输出
QByteArray output = process->readAll();
textEdit->appendPlainText(QString::fromLocal8Bit(output));
// 自动滚动到底部
QTextCursor cursor = textEdit->textCursor();
cursor.movePosition(QTextCursor::End);
textEdit->setTextCursor(cursor);
}
void ctai_cmd::slots_executeCommand(const QString &command)
{
if (!command.isEmpty()) {
// 写入命令到进程
process->write(command.toLocal8Bit() + "\n");
textEdit->appendPlainText("> " + command); // 显示输入命令
}
}