命令行"/>
用QT打造一个系统命令行
文章目录
- QT命令行
- 报错
QT实战教程:
- QT初步之计时器💎 QT信号与槽💎 QT多线程实战💎 QT文件读写
- QT调用外部程序💎 QT命令行💎 QT异步命令行
源码地址:【QT】通过QProcess实现一个命令行
QT命令行
在了解到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;
然后就可以看到
更多推荐
用QT打造一个系统命令行
发布评论