QT:QProcess执行终端命令并实时输出回显

1060 篇文章 297 订阅

在QT程序中我们经常需要与其他的程序间进行交互,而与终端进行交互就是一个例子。在不需要获取返回信息的情况下我们可以直接使用"system()"函数执行,但是当需要获取执行的结果或者需要实时地将结果输出到窗口上时,就比较难办了,需要涉及进程管道等等。而QT提供的QProcess类则大大简化了这一过程。

理论

QProcess是QT提供的与外部程序进行交互的一个类,主要使用下面的函数:

start();   // 启动一个进程
kill();   // 关闭启动的外部进程
wirte()  // 向外部进程写入数据
readAllStandardOutput();  // 读取外部进行的标准输出
readAllStandardError();      //读取外部进程的错误信息

创建QProcess对象并连接信号与槽

cmd = new QProcess(this);
connect(cmd , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
connect(cmd , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));

实现槽函数

void MainWindow::on_readoutput()
{
    ui->textEdit->append(cmd->readAllStandardOutput().data());   //将输出信息读取到编辑框
}

void MainWindow::on_readerror()
{
    QMessageBox::information(0, "Error", cmd->readAllStandardError().data());    //弹出信息框提示错误信息
}

启动外部程序并写入数据

cmd->start("bash");             //启动终端(Windows下改为cmd)
cmd->waitForStarted();        //等待启动完成
cmd->write("ls\n");               //向终端写入“ls”命令,注意尾部的“\n”不可省略

QProcess启动的外部程序并不会随着QT程序的关闭而关闭,所以在窗口的销毁函数中加入以下代码,使得窗口销毁时连带终结外部进程。

if(cmd)
{
      cmd->close();
      cmd->waitForFinished();
}

实践

实现1

     QProcess p(0);

     p.start("cmd");

     p.waitForStarted();

     p.write("dir\n");

     p.closeWriteChannel();

     p.waitForFinished();

     qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());

或者

 QProcess p(0);

     p.start("cmd", QStringList()<<"/c"<<"dir");

     p.waitForStarted();

     p.waitForFinished();
     qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值