用QT打造一个系统命令行

QT实战教程:

源码地址:【QT】通过QProcess实现一个命令行
在了解到QProcess的强大之处后,就可以实现一个系统的命令行了。

新建一个QT项目,然后拖动一个lineEdit改名为lineCode;拖动一个textBrowser改名为txtRecv。右键lineEdit转到槽,为其添加一个returnPressed()动作。

其代码为

void MainWindow::on_lineCode_returnPressed()
{
    
    
    QProcess cmd;
    QString codes = ui->lineCode->text();
    QStringList para = codes.split(" ");
    cmd.start(para.first(),para.sliced(1));
    cmd.waitForStarted();
    cmd.waitForFinished();
    ui->lineCode->setText("");
    ui->txtRecv->append(codes);
    ui->txtRecv->append(cmd.readAllStandardOutput());
}

效果为

在这里插入图片描述

这样做有个问题,就是没法显示错误,明明最后输入的qnmd并不是命令,却没有任何提示,故而需要打印错误。所以新拉一个txtcontent,然后将代码改为

void MainWindow::on_lineCode_returnPressed()
{
    
    
    QProcess cmd;
    QString codes = ui->lineCode->text();
    QStringList para = codes.split(" ");
    cmd.start(para.first(),para.sliced(1));
    cmd.waitForStarted();
    cmd.waitForFinished();
    ui->lineCode->setText("");
    QString output = cmd.readAllStandardOutput();
    if(!output.isEmpty()){
    
    
        ui->txtRecv->append(codes);
        ui->txtRecv->append(output);
    }
    QString err = cmd.readAllStandardError();
    if(!err.isEmpty()){
    
    
        ui->txtError->append(codes);
        ui->txtError->append(err);
    }
}

效果为

在这里插入图片描述

但这个其实并不能解决错误指令的问题,由于qnmd并不是有效指令,所以既没有标准输出,也没有标准错误。

为了甄别这种情况,可调用成员函数error(),其返回值是枚举类型,当返回值为0时,表示启动程序失败。

效果为

在这里插入图片描述

只需在waitForFinished();下面插入

if(cmd.error()==0)
  ui->txtError->append(codes+" error!!!\n请输入正确的指令");

其中error()返回的枚举类型如下

QProcess:: 描述
FailedToStart 0 进程启动失败
Crashed 1 进程成功后崩溃
Timedout 2 最后一次调用waitFor…()函数超时。此时QProcess状态不变,并可以再次调用waitFor…()类型的函数
WriteError 3 向进程中写入数据时出错。如进程尚未启动,或者输入通道被关闭时。
ReadError 4 从进程中读取数据时出错。如进程尚未启动时
UnknownError 5 默认返回值,未知或者没有错误。

最后,还是觉得哪里不对,主要原因是命令行中会给出当前位置,这一点并不难,只需用到

QString path = QCoreApplication::applicationDirPath();
codes = path + ">" + codes;

然后就可以看到

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37816922/article/details/124397664