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;
然后就可以看到