QT5 Ubuntu下c++调用linux命令、显示输出、执行多条命令

版权声明:本文为博主原创文章,未经博主允许不得转载。
qt中使用c++调用linux命令一般是通过QProcess类来实现的,原理是通过另开一个进程来执行命令,其步骤通常是:

QProcess *terminal;
terminal = new QProcess;   //初始化
terminal->start("command");   //执行命令

另外还可以为QProcess设置各种参数,如:

terminal->setWorkingDirectory("***"); //设置工作目录,类似执行cd命令
QProcessEnvironment env;              //设置进程环境变量
env.insert("name","path");            //name:变量名,path:地址
terminal->setProcessEnvironment(env);

实现每条命令执行后,如终端一般显示命令输出

connect(terminal,SIGNAL(readyRead()),this,SLOT(readOutput())); //接收进程发出的readyRead()信号,然后执行显示输出函数
void MainWindow::readOutput()
{
    if(ui->plainTextEdit->blockCount()>500)            //文本框中行数超过500行则清空
         ui->plainTextEdit->setPlainText("");
    ui->plainTextEdit->appendPlainText(terminal->readAll());  //在文本框中添加读到的输出信息
    if(scrollBar)                                        //自动滚动
        scrollBar->setSliderPosition(scrollBar->maximum());
}

上面的readAll()用于读取命令执行后输出的信息,可以通过terminal->setReadChannelMode(QProcess::MergedChannels)设置其要显示的读取通道,分为标准输出和标准错误输出等。也可以直接用readAllStandardOutput()或者readAllStandardError()来实现对应功能。这里的设置表示同时显示标准输出和错误输出。
scrollBar->setSliderPosition(scrollBar->maximum()) 实现自动滚动文本显示框功能,需要对scrollBar进行初始化:scrollBar = ui->plainTextEdit->verticalScrollBar();
实现连续执行多条命令的功能

connect(terminal,SIGNAL(finished(int)),this,SLOT(execute()));      //接收到finished()信号后,执行execute()函数
void MainWindow::execute()
{
    n++;
    if(nsize())  //多条命令可以事先放在一个数组或向量等结构中     
        terminal->start(commands[n]);
}
这里执行命令的方式分为terminal->start()和terminal->execute()两种方式,前者是非阻塞的(就是界面不会卡住),后者是阻塞的,所以execute()就相当于start()+waitForFinished(),如果只是简单的执行多条命令可以通过连续执行多条execute()函数,来实现连续执行的功能,但这样会阻塞界面,且不可以通过readAll()来读取输出信息。而直接连续执行多条start()会报Process is already running的错误,说明前一条start()还没执行完,下一条就又要执行了,这时可以加上waitForFinished()函数,等命令执行结束再执行下一条名,这样与直接执行execute()相比,能够读取到输出信息,但问题都是会阻塞界面,最好的办法就是使用上面展示的通过消息\槽的机制来实现。

最后,提前结束一条命令的执行可以通过以下代码实现:

terminal->close();
delete terminal;
terminal = 0;

你可能感兴趣的:(qt,linux命令,c++)