在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());