qprocess回调_QT利⽤QProcess类执⾏命令并获取返回值在QT程序中我们经常需要与其他的程序间进⾏交互,⽽与终端进⾏交互就是⼀个例⼦。在不需要获取返回信息的情况下我们可以直接使⽤"system()"函数执⾏,但是当需要获取执⾏的结果或者需要实时地将结果输出到窗⼝上时,就⽐较难办了,需要涉及进程管道等等。⽽QT提供的QProcess类则⼤⼤简化了这⼀过程。
QProcess是QT提供的与外部程序进⾏交互的⼀个类,主要使⽤到以下的函数:start(); //启动⼀个进程
kill(); //关闭启动的外部进程
write(); //向外部进程写⼊数据
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”不可省略
没有意外的话在编辑框中将看见输出了当前⽬录下的⽂件:
write的返回值同理,可以执⾏绝⼤部分在终端中执⾏的命令,不过有些程序所需要的实现可能不太⼀样,⽐如更新软件包,则需执⾏如下命令:sudo -S apt-get update
如果不带参数"-S",则会返回错误信息:“sudo:没有终端存在,且未指定askpass程序”
因此此种⽅法启动程序的时候如果需要root权限,则需要在"sudo"后加上选项"-S"。
还有的情况就是因为终端启动的时候其实已经帮我们读取了很多环境变量,但是我们在QT程序中直接启动bash的时候这些环境变量尚未被读取,导致⼀些程序⽆法启动,报错“未到命令”。这时需要我们主动去source⼀遍对应的环境。善后
QProcess启动的外部程序并不会随着QT程序的关闭⽽关闭,所以在窗⼝的销毁函数中加⼊以下代码,使得窗⼝销毁时连带终结外部进程。if(cmd)
{
cmd->close();
cmd->waitForFinished();
}写在最后
代码只是关键部分的代码,还有头⽂件中的声明、槽函数的声明等等⼀些琐碎细节的地⽅没有写出在⽂中,还请⾃⾏添加。同时为了⽅便你们参照,我也将⼯程上传了⼀份到GitHub中,如有不懂之处,可参照我的GitHub上的代码:QProcess_Examples-字节莫的GitHub
如有问题欢迎留⾔讨论

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。