QProcess执行带管道的命令

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

QProcess处理带管道的shell

QProcess::start()//非阻塞
QProcess::execute()//阻塞
QProcess::readAll()//读取结果
//带参数
QProcess *process = new QProcess;
QStringList str;
str << "";
process->start("./WinMerge/WinMergeU.exe",str);
//结束时操作
if(process)
{
	process->close();
	delete process;
	process = 0;//NULL
}
//另类操作
QStringList qsl;
qsl.append( "./c" );
qsl+="162.105.74.15";
pro= new QProcess(qsl);
QDir dir("/home/wujin");
pro->setWorkingDirectory(dir);
if(pro->start()) 
	printf("ok\n");
else 
	printf("something is wrong\n");

一、QProcess不带管道的执行并取结果

	QProcess *proc = new QProcess();
    QString qCmd = "find ./ -name *.so -print0 | xargs -0 objdump -x | grep -oE \"T_[0-9, a-f, A-F]{4}\" "; 
    proc->start(qCmd);  
    if (proc->waitForFinished(1000))
    { 
        QByteArray qOutput = proc->readAllStandardOutput();
        QList<QByteArray> list = qOutput.split('\n');
        QList<QByteArray>::iterator itor = list.begin(); 
        for ( ; itor != list.end(); itor++)
        {
            QByteArray strline = *itor;
            qDebug() << strline;
        } 
    }

二、QProcess执行带管道的命令

管道符是由shell进行解析处理的,上面的用法,相当于是两个shell命令,不能在一个QProcess中处理。需通过如下方法:

process.start("bash", QStringList() << "-c" << "cat file | grep string");
    QStringList options; 
    options << "-c"<< "find ./ -name *.so -print0 | xargs -0 objdump -x | grep -oE \"T_[0-9, a-f, A-F]{4}\""; 
    QProcess *proc = new QProcess();
    proc->start("/bin/bash", options);
QStringList options;
options <<-c” << “ls -l | grep a | sort”;
QProcess process;
process.start("/bin/bash", options);
process.waitForFinished();
process.waitForReadyRead();//
process.close();

三、给QProcess添加结束信号来处理结果

void MainWindow::openProcess()  
{  
    p->start("cmd.exe", QStringList() << "/c" << "dir");  
    connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
}  
 
void MainWindow::readResult(int exitCode)  
{  
    if(exitCode == 0) {  
        QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
        QString result = gbkCodec->toUnicode(p->readAll());  
        QMessageBox::information(this, "dir", result);  
    }  
}  
connect(&mProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(redFromStdOut()));
connect(&mProcess, SIGNAL(readyReadStandardError()), this, SLOT(redFromStdErr()));
connect(&mProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
connect(&mProcess, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processFinished(int,QProcess::ExitStatus)));

void FloodForecast::redFromStdOut()
{
  ui.textBrowse->append(mProcess.readAllStandardOutput());
}
void FloodForecast::redFromStdErr()
{
  ui.textBrowse->append(mProcess.readAllStandardError());
}
void FloodForecast::processError(QProcess::ProcessError error)
{
  if(error==QProcess::FailedToStart)
  {
    ui.textBrowse->append("程序启动失败.\r\n");
  }
}
void FloodForecast::processFinished(int exitCode,QProcess::ExitStatus exitStatus)
{
  if(exitStatus == QProcess::CrashExit)
  {
    ui.textBrowse->append("程序异常终止.\r\n");
  }
  else
  {
    ui.textBrowse->append("程序正常结束.\r\n");
  }
}

四、QProcess调用cmd要注意特殊符号的转义

windows上的cmd若有“& \ < > ^ |”,要使用转义符“^”:

    ^&  =>   &
    ^^  =>   ^
  "^^"  => "^^"
  ^^^&  =>  ^&
  ^^^^  =>  ^^
^^^^^&  => ^^&
QString program = "cmd.exe"; 
QStringList arguments; 
arguments << getenv(VS90COMNTOOLS) + "\\vsvars32.bat" 
 << "&" << "vcbuild.exe" << pathToSolution << "Debug^|Win32"; 
QProcess::execute(program, arguments); 

五、结果实时回显

Qt QProocess执行终端命令并实时输出回显


版权声明:本文为pzs0221原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。