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::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);